@agntn/registries 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -3
- package/dist/THIRD-PARTY-LICENSES.md +36 -0
- package/dist/_chunks/cache.mjs +15 -0
- package/dist/{cache/index.mjs.map → _chunks/cache.mjs.map} +1 -1
- package/dist/{commands/cache.mjs → _chunks/cache2.mjs} +6 -8
- package/dist/_chunks/cache2.mjs.map +1 -0
- package/dist/{cache → _chunks}/cached-registry.mjs +12 -8
- package/dist/_chunks/cached-registry.mjs.map +1 -0
- package/dist/{commands → _chunks}/deps.mjs +19 -13
- package/dist/_chunks/deps.mjs.map +1 -0
- package/dist/_chunks/helpers.mjs +53 -19
- package/dist/_chunks/helpers.mjs.map +1 -1
- package/dist/_chunks/index.d.mts +9 -23
- package/dist/_chunks/index.d.mts.map +1 -1
- package/dist/_chunks/index2.d.mts +181 -0
- package/dist/_chunks/index2.d.mts.map +1 -0
- package/dist/_chunks/index3.d.mts +188 -0
- package/dist/_chunks/index3.d.mts.map +1 -0
- package/dist/_chunks/info.mjs +105 -0
- package/dist/_chunks/info.mjs.map +1 -0
- package/dist/_chunks/libs/typebox.mjs +278 -0
- package/dist/_chunks/libs/typebox.mjs.map +1 -0
- package/dist/_chunks/lockfile.mjs +183 -0
- package/dist/_chunks/lockfile.mjs.map +1 -0
- package/dist/_chunks/maintainers.mjs +53 -0
- package/dist/_chunks/maintainers.mjs.map +1 -0
- package/dist/_chunks/mcp.mjs +15 -0
- package/dist/_chunks/mcp.mjs.map +1 -0
- package/dist/_chunks/registries.mjs +514 -245
- package/dist/_chunks/registries.mjs.map +1 -1
- package/dist/_chunks/registry.d.mts +121 -10
- package/dist/_chunks/registry.d.mts.map +1 -1
- package/dist/_chunks/registry.mjs +121 -31
- package/dist/_chunks/registry.mjs.map +1 -1
- package/dist/{commands → _chunks}/shared.mjs +15 -8
- package/dist/_chunks/shared.mjs.map +1 -0
- package/dist/_chunks/tool-operations.mjs +63 -0
- package/dist/_chunks/tool-operations.mjs.map +1 -0
- package/dist/_chunks/version.mjs +4 -0
- package/dist/_chunks/version.mjs.map +1 -0
- package/dist/{commands → _chunks}/versions.mjs +10 -9
- package/dist/_chunks/versions.mjs.map +1 -0
- package/dist/ai.d.mts +4 -4
- package/dist/ai.mjs +0 -1
- package/dist/ai.mjs.map +1 -1
- package/dist/cache/index.d.mts +3 -23
- package/dist/cache/index.mjs +4 -11
- package/dist/cli.mjs +9 -7
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +4 -56
- package/dist/index.mjs +4 -7
- package/dist/mcp.d.mts +7 -0
- package/dist/mcp.d.mts.map +1 -0
- package/dist/mcp.mjs +155 -0
- package/dist/mcp.mjs.map +1 -0
- package/dist/registries/index.d.mts +0 -1
- package/dist/registries/index.mjs +0 -1
- package/dist/tool-operations.d.mts +36 -0
- package/dist/tool-operations.d.mts.map +1 -0
- package/dist/tool-operations.mjs +5 -0
- package/package.json +55 -9
- package/packages/omp/extensions/registries.ts +112 -0
- package/packages/pi/extensions/registries.ts +125 -0
- package/dist/_chunks/errors.d.mts +0 -90
- package/dist/_chunks/errors.d.mts.map +0 -1
- package/dist/_chunks/purl.mjs +0 -200
- package/dist/_chunks/purl.mjs.map +0 -1
- package/dist/_chunks/types.d.mts +0 -73
- package/dist/_chunks/types.d.mts.map +0 -1
- package/dist/cache/cached-registry.d.mts +0 -35
- package/dist/cache/cached-registry.d.mts.map +0 -1
- package/dist/cache/cached-registry.mjs.map +0 -1
- package/dist/cache/index.d.mts.map +0 -1
- package/dist/cache/lockfile.d.mts +0 -50
- package/dist/cache/lockfile.d.mts.map +0 -1
- package/dist/cache/lockfile.mjs +0 -68
- package/dist/cache/lockfile.mjs.map +0 -1
- package/dist/cache/paths.d.mts +0 -11
- package/dist/cache/paths.d.mts.map +0 -1
- package/dist/cache/paths.mjs +0 -26
- package/dist/cache/paths.mjs.map +0 -1
- package/dist/cache/storage.d.mts +0 -22
- package/dist/cache/storage.d.mts.map +0 -1
- package/dist/cache/storage.mjs +0 -40
- package/dist/cache/storage.mjs.map +0 -1
- package/dist/commands/cache.d.mts +0 -7
- package/dist/commands/cache.d.mts.map +0 -1
- package/dist/commands/cache.mjs.map +0 -1
- package/dist/commands/deps.d.mts +0 -23
- package/dist/commands/deps.d.mts.map +0 -1
- package/dist/commands/deps.mjs.map +0 -1
- package/dist/commands/info.d.mts +0 -26
- package/dist/commands/info.d.mts.map +0 -1
- package/dist/commands/info.mjs +0 -54
- package/dist/commands/info.mjs.map +0 -1
- package/dist/commands/maintainers.d.mts +0 -23
- package/dist/commands/maintainers.d.mts.map +0 -1
- package/dist/commands/maintainers.mjs +0 -46
- package/dist/commands/maintainers.mjs.map +0 -1
- package/dist/commands/shared.d.mts +0 -27
- package/dist/commands/shared.d.mts.map +0 -1
- package/dist/commands/shared.mjs.map +0 -1
- package/dist/commands/versions.d.mts +0 -31
- package/dist/commands/versions.d.mts.map +0 -1
- package/dist/commands/versions.mjs.map +0 -1
- package/dist/core/index.d.mts +0 -4
- package/dist/core/index.mjs +0 -3
- package/dist/index.d.mts.map +0 -1
- package/dist/types.d.mts +0 -3
- package/dist/types.mjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registries.mjs","names":[],"sources":["../../src/registries/npm.ts","../../src/registries/cargo.ts","../../src/registries/pypi.ts","../../src/registries/rubygems.ts","../../src/registries/packagist.ts","../../src/registries/alpm.ts"],"sourcesContent":["import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { HTTPError, NotFoundError } from \"../core/errors.ts\";\nimport { normalizeLicense } from \"../core/license.ts\";\nimport { normalizeRepositoryURL } from \"../core/repository.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\n\n/** npm registry API response for a single package. */\ninterface NpmPackageResponse {\n name: string;\n description?: string;\n homepage?: string;\n repository?:\n | {\n type?: string;\n url?: string;\n }\n | string;\n license?:\n | string\n | {\n type?: string;\n };\n keywords?: string[];\n \"dist-tags\": {\n latest: string;\n };\n versions: Record<string, NpmVersion>;\n maintainers?: Array<{\n name?: string;\n email?: string;\n url?: string;\n }>;\n time?: Record<string, string>;\n}\n\n/** npm version data. */\ninterface NpmVersion {\n name: string;\n version: string;\n description?: string;\n license?:\n | string\n | {\n type?: string;\n };\n keywords?: string[];\n author?: {\n name?: string;\n email?: string;\n url?: string;\n };\n contributors?: Array<{\n name?: string;\n email?: string;\n url?: string;\n }>;\n maintainers?: Array<{\n name?: string;\n email?: string;\n url?: string;\n }>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n dist?: {\n integrity?: string;\n shasum?: string;\n tarball?: string;\n };\n deprecated?: boolean | string;\n}\n\n/** npm registry client. */\nexport class NpmRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n ecosystem(): string {\n return \"npm\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const encodedName = this.encodeName(name);\n const url = `${this.baseURL}/${encodedName}`;\n\n try {\n const data = await this.client.getJSON<NpmPackageResponse>(url, signal);\n\n const latestVersion = data[\"dist-tags\"].latest;\n const latestVersionData = data.versions[latestVersion];\n\n const licenses = this.extractLicense(data.license || latestVersionData?.license);\n const namespace = this.extractNamespace(name);\n\n return {\n name: data.name,\n description: data.description || \"\",\n homepage: data.homepage || \"\",\n documentation: \"\",\n repository: normalizeRepositoryURL(data.repository || \"\"),\n licenses,\n keywords: data.keywords || [],\n namespace,\n latestVersion,\n metadata: {},\n };\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"npm\", name);\n }\n throw error;\n }\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const encodedName = this.encodeName(name);\n const url = `${this.baseURL}/${encodedName}`;\n\n try {\n const data = await this.client.getJSON<NpmPackageResponse>(url, signal);\n const versions: Version[] = [];\n\n for (const [versionStr, versionData] of Object.entries(data.versions)) {\n const licenses = this.extractLicense(versionData.license);\n const publishedAt = data.time?.[versionStr] ? new Date(data.time[versionStr]) : null;\n\n const status = versionData.deprecated ? \"deprecated\" : \"\";\n\n const integrity = versionData.dist?.integrity\n ? versionData.dist.integrity\n : versionData.dist?.shasum\n ? `sha1-${versionData.dist.shasum}`\n : \"\";\n\n versions.push({\n number: versionStr,\n publishedAt,\n licenses,\n integrity,\n status,\n metadata: {},\n });\n }\n\n return versions;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"npm\", name);\n }\n throw error;\n }\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const encodedName = this.encodeName(name);\n const url = `${this.baseURL}/${encodedName}/${version}`;\n\n try {\n const versionData = await this.client.getJSON<NpmVersion>(url, signal);\n\n const dependencies: Dependency[] = [];\n\n // Runtime dependencies\n if (versionData.dependencies) {\n for (const [depName, requirements] of Object.entries(versionData.dependencies)) {\n if (\n versionData.optionalDependencies &&\n Object.hasOwn(versionData.optionalDependencies, depName)\n ) {\n continue;\n }\n dependencies.push({\n name: depName,\n requirements,\n scope: \"runtime\",\n optional: false,\n });\n }\n }\n\n // Development dependencies\n if (versionData.devDependencies) {\n for (const [depName, requirements] of Object.entries(versionData.devDependencies)) {\n dependencies.push({\n name: depName,\n requirements,\n scope: \"development\",\n optional: false,\n });\n }\n }\n\n // Optional dependencies\n if (versionData.optionalDependencies) {\n for (const [depName, requirements] of Object.entries(versionData.optionalDependencies)) {\n dependencies.push({\n name: depName,\n requirements,\n scope: \"runtime\",\n optional: true,\n });\n }\n }\n\n // Peer dependencies\n if (versionData.peerDependencies) {\n for (const [depName, requirements] of Object.entries(versionData.peerDependencies)) {\n dependencies.push({\n name: depName,\n requirements,\n scope: \"runtime\",\n optional: false,\n });\n }\n }\n\n return dependencies;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"npm\", name, version);\n }\n throw error;\n }\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const encodedName = this.encodeName(name);\n const url = `${this.baseURL}/${encodedName}`;\n\n try {\n const data = await this.client.getJSON<NpmPackageResponse>(url, signal);\n const maintainers: Maintainer[] = [];\n const seen = new Set<string>();\n\n // Use top-level maintainers (people with publish access)\n if (data.maintainers) {\n for (const maintainer of data.maintainers) {\n const key = this.maintainerKey(maintainer.name, maintainer.email);\n if (!key || seen.has(key)) continue;\n seen.add(key);\n maintainers.push({\n uuid: \"\",\n login: maintainer.email ? maintainer.email.split(\"@\")[0] : \"\",\n name: maintainer.name || \"\",\n email: maintainer.email || \"\",\n url: maintainer.url || \"\",\n role: \"\",\n });\n }\n }\n\n // Supplement with author and contributors from the latest version only\n const latestTag = data[\"dist-tags\"].latest;\n const latestVersion = data.versions[latestTag];\n\n if (latestVersion?.author) {\n const key = this.maintainerKey(latestVersion.author.name, latestVersion.author.email);\n if (key && !seen.has(key)) {\n seen.add(key);\n maintainers.push({\n uuid: \"\",\n login: latestVersion.author.email ? latestVersion.author.email.split(\"@\")[0] : \"\",\n name: latestVersion.author.name || \"\",\n email: latestVersion.author.email || \"\",\n url: latestVersion.author.url || \"\",\n role: \"author\",\n });\n }\n }\n\n if (latestVersion?.contributors) {\n for (const contributor of latestVersion.contributors) {\n const key = this.maintainerKey(contributor.name, contributor.email);\n if (key && !seen.has(key)) {\n seen.add(key);\n maintainers.push({\n uuid: \"\",\n login: contributor.email ? contributor.email.split(\"@\")[0] : \"\",\n name: contributor.name || \"\",\n email: contributor.email || \"\",\n url: contributor.url || \"\",\n role: \"contributor\",\n });\n }\n }\n }\n\n return maintainers;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"npm\", name);\n }\n throw error;\n }\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, version?: string) => {\n const base = `https://www.npmjs.com/package/${name}`;\n return version ? `${base}/v/${version}` : base;\n },\n download: (name: string, version: string) => {\n const encodedName = this.encodeName(name);\n const tarballName = name.includes(\"/\") ? name.split(\"/\")[1] : name;\n return `https://registry.npmjs.org/${encodedName}/-/${tarballName}-${version}.tgz`;\n },\n documentation: (name: string, _version?: string) => {\n return `https://www.npmjs.com/package/${name}`;\n },\n readme: (name: string, version?: string) => {\n const ver = version ? `@${version}` : \"\";\n return `https://cdn.jsdelivr.net/npm/${name}${ver}/README.md`;\n },\n purl: (name: string, version?: string) => {\n const namespace = this.extractNamespace(name);\n const bareName = namespace ? name.slice(namespace.length + 1) : name;\n return buildPURL({ type: \"npm\", namespace, name: bareName, version });\n },\n };\n }\n\n /** Build a stable dedup key. Prefers email (unique per account), falls back to name. */\n private maintainerKey(name: string | undefined, email: string | undefined): string {\n if (email) return email;\n if (name) return name;\n return \"\";\n }\n\n /** Encode package name for URL (handle scoped packages). */\n private encodeName(name: string): string {\n if (name.startsWith(\"@\")) {\n return name.replace(\"/\", \"%2F\");\n }\n return name;\n }\n\n /** Extract namespace from scoped package name. */\n private extractNamespace(name: string): string {\n if (name.startsWith(\"@\")) {\n const parts = name.split(\"/\");\n return parts[0] || \"\";\n }\n return \"\";\n }\n\n /** Extract and normalize license. */\n private extractLicense(raw: string | { type?: string } | undefined): string {\n if (!raw) return \"\";\n\n if (typeof raw === \"string\") {\n return normalizeLicense(raw);\n }\n\n if (typeof raw === \"object\" && raw !== null) {\n const obj = raw as Record<string, unknown>;\n if (typeof obj[\"type\"] === \"string\") {\n return normalizeLicense(obj[\"type\"]);\n }\n }\n\n return \"\";\n }\n}\n\nregister(\"npm\", \"https://registry.npmjs.org\", NpmRegistry);\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { HTTPError, NotFoundError } from \"../core/errors.ts\";\nimport { normalizeLicense } from \"../core/license.ts\";\nimport { normalizeRepositoryURL } from \"../core/repository.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\n\n/** Crates.io API response for a single crate. */\ninterface CratesPackageResponse {\n crate: {\n id: number;\n name: string;\n updated_at: string;\n created_at: string;\n downloads: number;\n recent_downloads: number;\n max_version: string;\n max_stable_version: string;\n newest_version: string;\n description: string;\n homepage: string;\n documentation: string;\n repository: string;\n keywords: string[];\n categories: Array<{\n id: string;\n category: string;\n created_at: string;\n }>;\n badges: unknown[];\n links: Record<string, string>;\n };\n versions: CratesVersion[];\n}\n\n/** Crates.io version data. */\ninterface CratesVersion {\n id: number;\n num: string;\n dl_path: string;\n readme_path: string;\n created_at: string;\n updated_at: string;\n downloads: number;\n features: Record<string, string[]>;\n yanked: boolean;\n license: string;\n links: Record<string, string>;\n crate_size: number;\n published_by: {\n id: number;\n login: string;\n name: string;\n avatar: string;\n url: string;\n };\n checksum: string;\n}\n\n/** Crates.io dependencies response. */\ninterface CratesDependenciesResponse {\n dependencies: CratesDependency[];\n meta: {\n prelude: boolean;\n };\n}\n\n/** Crates.io dependency data. */\ninterface CratesDependency {\n id: number;\n version_id: number;\n crate_id: string;\n req: string;\n optional: boolean;\n default_features: boolean;\n features: string[];\n target: string | null;\n kind: string;\n downloads: number;\n}\n\n/** Crates.io maintainers response. */\ninterface CratesMaintainersResponse {\n users: CratesMaintainer[];\n}\n\n/** Crates.io maintainer data. */\ninterface CratesMaintainer {\n id: number;\n login: string;\n name: string;\n avatar: string;\n url: string;\n}\n\n/** Crates.io registry client. */\nexport class CargoRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n ecosystem(): string {\n return \"cargo\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const url = `${this.baseURL}/api/v1/crates/${name}`;\n\n try {\n const data = await this.client.getJSON<CratesPackageResponse>(url, signal);\n const crateData = data.crate;\n const latestVersion = crateData.max_stable_version || crateData.max_version;\n const latestVersionData = data.versions.find((v) => v.num === latestVersion);\n\n return {\n name: crateData.name,\n description: crateData.description || \"\",\n homepage: crateData.homepage || \"\",\n documentation: crateData.documentation || \"\",\n repository: normalizeRepositoryURL(crateData.repository || \"\"),\n licenses: normalizeLicense(\n latestVersionData ? latestVersionData.license : (data.versions[0]?.license ?? \"\"),\n ),\n keywords: crateData.keywords,\n namespace: \"\",\n latestVersion,\n metadata: {\n downloads: crateData.downloads,\n recentDownloads: crateData.recent_downloads,\n categories: crateData.categories,\n newestVersion: crateData.newest_version,\n defaultVersion: crateData.max_version,\n updatedAt: crateData.updated_at,\n createdAt: crateData.created_at,\n },\n };\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"cargo\", name);\n }\n throw error;\n }\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const url = `${this.baseURL}/api/v1/crates/${name}`;\n\n try {\n const data = await this.client.getJSON<CratesPackageResponse>(url, signal);\n const versions: Version[] = [];\n\n for (const versionData of data.versions) {\n const publishedAt = new Date(versionData.created_at);\n const status = versionData.yanked ? \"yanked\" : \"\";\n\n versions.push({\n number: versionData.num,\n publishedAt,\n licenses: normalizeLicense(versionData.license),\n integrity: `sha256-${versionData.checksum}`,\n status,\n metadata: {\n crateSize: versionData.crate_size,\n features: versionData.features,\n downloads: versionData.downloads,\n },\n });\n }\n\n return versions;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"cargo\", name);\n }\n throw error;\n }\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const url = `${this.baseURL}/api/v1/crates/${name}/${version}/dependencies`;\n\n try {\n const data = await this.client.getJSON<CratesDependenciesResponse>(url, signal);\n const dependencies: Dependency[] = [];\n\n for (const dep of data.dependencies) {\n let scope: \"runtime\" | \"development\" | \"test\" | \"build\" | \"optional\";\n\n if (dep.kind === \"dev\") {\n scope = \"development\";\n } else if (dep.kind === \"build\") {\n scope = \"build\";\n } else {\n scope = \"runtime\";\n }\n\n dependencies.push({\n name: dep.crate_id,\n requirements: dep.req,\n scope,\n optional: dep.optional,\n });\n }\n\n return dependencies;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"cargo\", name, version);\n }\n throw error;\n }\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const url = `${this.baseURL}/api/v1/crates/${name}/owner_user`;\n\n try {\n const data = await this.client.getJSON<CratesMaintainersResponse>(url, signal);\n const maintainers: Maintainer[] = [];\n\n for (const user of data.users) {\n maintainers.push({\n uuid: user.id.toString(),\n login: user.login,\n name: user.name,\n email: \"\",\n url: user.url,\n role: \"\",\n });\n }\n\n return maintainers;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"cargo\", name);\n }\n throw error;\n }\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, version?: string) => {\n const base = `https://crates.io/crates/${name}`;\n return version ? `${base}/${version}` : base;\n },\n download: (name: string, version: string) => {\n return `https://crates.io/api/v1/crates/${name}/${version}/download`;\n },\n documentation: (name: string, version?: string) => {\n return version ? `https://docs.rs/${name}/${version}` : `https://docs.rs/${name}`;\n },\n readme: (name: string, version?: string) => {\n return version\n ? `https://crates.io/api/v1/crates/${name}/${version}/readme`\n : `https://crates.io/crates/${name}`;\n },\n purl: (name: string, version?: string) => {\n return buildPURL({ type: \"cargo\", name, version });\n },\n };\n }\n}\n\nregister(\"cargo\", \"https://crates.io\", CargoRegistry);\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { HTTPError, NotFoundError } from \"../core/errors.ts\";\nimport { normalizeLicense } from \"../core/license.ts\";\nimport { normalizeRepositoryURL } from \"../core/repository.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\n\nconst PYPI_FILENAME_SEPARATORS = [\"_\", \"-\", \".\"] as const;\n\n/** PyPI JSON API response for a package. */\ninterface PyPIPackageResponse {\n info: {\n name: string;\n version: string;\n summary: string;\n description: string;\n license: string;\n keywords: string;\n author: string;\n author_email: string;\n project_urls: Record<string, string>;\n requires_dist: string[] | null;\n };\n urls: PyPIFile[];\n}\n\n/** PyPI file information. */\ninterface PyPIFile {\n filename: string;\n url: string;\n upload_time_iso_8601: string;\n yanked: boolean;\n digests: {\n sha256: string;\n };\n}\n\n/** PyPI Simple API (PEP 691) response for a project. */\ninterface PyPISimpleResponse {\n meta: { \"api-version\": string };\n name: string;\n versions: string[];\n files: PyPISimpleFile[];\n}\n\n/** A single file entry in the Simple API response. */\ninterface PyPISimpleFile {\n filename: string;\n url: string;\n hashes: { sha256?: string };\n \"requires-python\"?: string;\n yanked?: string | false;\n \"upload-time\"?: string;\n}\n\n/** PyPI registry client. */\nexport class PyPIRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n private readonly downloadUrls = new Map<string, string>();\n\n ecosystem(): string {\n return \"pypi\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const normalized = this.normalizeName(name);\n const url = `${this.baseURL}/pypi/${normalized}/json`;\n\n try {\n const data = await this.client.getJSON<PyPIPackageResponse>(url, signal);\n const info = data.info;\n\n const licenses = normalizeLicense(info.license);\n const repository = this.extractRepository(info.project_urls);\n const keywords = this.parseKeywords(info.keywords);\n\n return {\n name: info.name,\n description: info.summary || info.description || \"\",\n homepage: this.findProjectUrl(info.project_urls, [\"Homepage\"]),\n documentation: this.findProjectUrl(info.project_urls, [\"Documentation\"]),\n repository,\n licenses,\n keywords,\n namespace: \"\",\n latestVersion: info.version,\n metadata: {},\n };\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"pypi\", name);\n }\n throw error;\n }\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const normalized = this.normalizeName(name);\n const url = `${this.baseURL}/simple/${normalized}/`;\n\n try {\n const data = await this.client.getJSON<PyPISimpleResponse>(url, signal, {\n Accept: \"application/vnd.pypi.simple.v1+json\",\n });\n\n const filesByVersion = new Map<string, PyPISimpleFile[]>();\n for (const version of data.versions) {\n filesByVersion.set(version, []);\n }\n\n for (const file of data.files) {\n const version = this.matchFileVersion(file.filename, normalized, data.versions);\n if (version) {\n filesByVersion.get(version)!.push(file);\n }\n }\n\n const versions: Version[] = [];\n for (const [versionStr, files] of filesByVersion) {\n if (files.length === 0) {\n versions.push({\n number: versionStr,\n publishedAt: null,\n licenses: \"\",\n integrity: \"\",\n status: \"\",\n metadata: {},\n });\n continue;\n }\n\n const sdist = files.find((f) => f.filename.endsWith(\".tar.gz\"));\n const file = sdist ?? files[0]!;\n const publishedAt = file[\"upload-time\"] ? new Date(file[\"upload-time\"]) : null;\n const integrity = file.hashes?.sha256 ? `sha256-${file.hashes.sha256}` : \"\";\n const status = file.yanked ? \"yanked\" : \"\";\n\n this.downloadUrls.set(`${normalized}@${versionStr}`, file.url);\n\n versions.push({\n number: versionStr,\n publishedAt,\n licenses: \"\",\n integrity,\n status,\n metadata: {},\n });\n }\n\n return versions;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"pypi\", name);\n }\n throw error;\n }\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const normalized = this.normalizeName(name);\n const url = `${this.baseURL}/pypi/${normalized}/${version}/json`;\n\n try {\n const data = await this.client.getJSON<PyPIPackageResponse>(url, signal);\n const dependencies: Dependency[] = [];\n\n if (data.info.requires_dist) {\n for (const depStr of data.info.requires_dist) {\n const dep = this.parsePEP508(depStr);\n if (dep) {\n dependencies.push(dep);\n }\n }\n }\n\n return dependencies;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"pypi\", name, version);\n }\n throw error;\n }\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const normalized = this.normalizeName(name);\n const url = `${this.baseURL}/pypi/${normalized}/json`;\n\n try {\n const data = await this.client.getJSON<PyPIPackageResponse>(url, signal);\n const maintainers: Maintainer[] = [];\n\n if (data.info.author || data.info.author_email) {\n maintainers.push({\n uuid: \"\",\n login: data.info.author_email ? data.info.author_email.split(\"@\")[0] : \"\",\n name: data.info.author || \"\",\n email: data.info.author_email || \"\",\n url: \"\",\n role: \"author\",\n });\n }\n\n return maintainers;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"pypi\", name);\n }\n throw error;\n }\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, version?: string) => {\n const normalized = this.normalizeName(name);\n const base = `https://pypi.org/project/${normalized}`;\n return version ? `${base}/${version}` : base;\n },\n download: (name: string, version: string) => {\n const normalized = this.normalizeName(name);\n return (\n this.downloadUrls.get(`${normalized}@${version}`) ??\n `https://pypi.org/project/${normalized}/${version}/`\n );\n },\n documentation: (name: string, _version?: string) => {\n const normalized = this.normalizeName(name);\n return `https://pypi.org/project/${normalized}`;\n },\n readme: (name: string, version?: string) => {\n const normalized = this.normalizeName(name);\n return version\n ? `https://pypi.org/project/${normalized}/${version}/`\n : `https://pypi.org/project/${normalized}/`;\n },\n purl: (name: string, version?: string) => {\n return buildPURL({ type: \"pypi\", name: this.normalizeName(name), version });\n },\n };\n }\n\n /** Match a filename to a version from the known versions list. */\n private matchFileVersion(\n filename: string,\n normalizedName: string,\n versions: string[],\n ): string | undefined {\n const lower = filename.toLowerCase();\n let prefix: string | undefined;\n\n for (const separator of PYPI_FILENAME_SEPARATORS) {\n const candidate = normalizedName.replaceAll(\"-\", separator) + \"-\";\n if (lower.startsWith(candidate)) {\n prefix = candidate;\n break;\n }\n }\n\n if (!prefix) return undefined;\n\n const afterPrefix = filename.slice(prefix.length);\n\n // Wheel: {name}-{version}-{python}-{abi}-{platform}.whl\n // Version is before the first dash after the prefix\n const dashIdx = afterPrefix.indexOf(\"-\");\n if (dashIdx !== -1) {\n const candidate = afterPrefix.slice(0, dashIdx);\n if (versions.includes(candidate)) return candidate;\n }\n\n // Sdist: {name}-{version}.tar.gz / .zip / .tar.bz2\n const stripped = afterPrefix.replace(/\\.(tar\\.(gz|bz2|xz)|zip)$/i, \"\");\n if (versions.includes(stripped)) return stripped;\n\n return undefined;\n }\n\n /** Normalize package name per PEP 503. */\n private normalizeName(name: string): string {\n return name.toLowerCase().replace(/[-_.]+/g, \"-\");\n }\n\n /** Extract repository URL from project_urls. */\n private extractRepository(projectUrls: Record<string, string> | undefined): string {\n const url = this.findProjectUrl(projectUrls, [\n \"Repository\",\n \"Source\",\n \"Source Code\",\n \"GitHub\",\n \"Homepage\",\n ]);\n return normalizeRepositoryURL(url);\n }\n\n /** Find a project URL by key, case-insensitive. */\n private findProjectUrl(projectUrls: Record<string, string> | undefined, keys: string[]): string {\n if (!projectUrls) return \"\";\n\n const lowered = new Map<string, string>();\n for (const [k, v] of Object.entries(projectUrls)) {\n lowered.set(k.toLowerCase(), v);\n }\n\n for (const key of keys) {\n const value = lowered.get(key.toLowerCase());\n if (value) return value;\n }\n\n return \"\";\n }\n\n /** Parse comma-separated keywords. */\n private parseKeywords(keywords: string | undefined): string[] {\n if (!keywords) return [];\n return keywords\n .split(\",\")\n .map((k) => k.trim())\n .filter(Boolean);\n }\n\n /** Parse PEP 508 dependency string into a normalized Dependency. */\n private parsePEP508(depStr: string): Dependency | null {\n // PEP 508 format: name [extras] (version_spec) ; markers\n const semiIdx = depStr.indexOf(\";\");\n const mainPart = semiIdx === -1 ? depStr.trim() : depStr.slice(0, semiIdx).trim();\n const markerStr = semiIdx === -1 ? \"\" : depStr.slice(semiIdx + 1).trim();\n\n // Extract name, skip [extras] bracket group, capture version spec\n const match = mainPart.match(/^([a-zA-Z0-9._-]+)\\s*(?:\\[.*?\\])?\\s*(.*)$/);\n if (!match) return null;\n\n const depName = match[1]!;\n let versionSpec = match[2]!.trim();\n\n // Strip surrounding parentheses: \"(<4,>=2)\" -> \"<4,>=2\"\n if (versionSpec.startsWith(\"(\") && versionSpec.endsWith(\")\")) {\n versionSpec = versionSpec.slice(1, -1).trim();\n }\n\n // Only `extra == \"...\"` markers affect scope. Platform markers don't.\n let scope: \"runtime\" | \"development\" | \"test\" | \"build\" | \"optional\" = \"runtime\";\n let optional = false;\n\n if (markerStr) {\n const extraMatch = markerStr.match(/extra\\s*==\\s*[\"']([^\"']+)[\"']/);\n if (extraMatch) {\n optional = true;\n const extraName = extraMatch[1]!.toLowerCase();\n if (/^dev(elop(ment)?)?$/.test(extraName)) {\n scope = \"development\";\n } else if (/^test(s|ing)?$/.test(extraName)) {\n scope = \"test\";\n }\n }\n }\n\n return {\n name: this.normalizeName(depName),\n requirements: versionSpec,\n scope,\n optional,\n };\n }\n}\n\nregister(\"pypi\", \"https://pypi.org\", PyPIRegistry);\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { HTTPError, NotFoundError } from \"../core/errors.ts\";\nimport { combineLicenses, normalizeLicense } from \"../core/license.ts\";\nimport { normalizeRepositoryURL } from \"../core/repository.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\n\n/** RubyGems API response for a single gem. */\ninterface RubyGemsGemResponse {\n name: string;\n version?: string;\n description: string;\n homepage_uri?: string;\n documentation_uri?: string;\n source_code_uri?: string;\n licenses?: string[];\n metadata?: Record<string, unknown>;\n dependencies?: {\n runtime?: Array<{\n name: string;\n requirements: string;\n }>;\n development?: Array<{\n name: string;\n requirements: string;\n }>;\n };\n}\n\n/** RubyGems version data. */\ninterface RubyGemsVersionResponse {\n number: string;\n sha: string;\n created_at?: string;\n yanked?: boolean;\n}\n\n/** RubyGems owner data. */\ninterface RubyGemsOwnerResponse {\n handle: string;\n email?: string;\n}\n\n/** RubyGems registry client. */\nexport class RubyGemsRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n ecosystem(): string {\n return \"gem\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const url = `${this.baseURL}/api/v1/gems/${name}.json`;\n\n try {\n const data = await this.client.getJSON<RubyGemsGemResponse>(url, signal);\n\n // Extract licenses\n const licenses = data.licenses\n ? combineLicenses(data.licenses.map((l) => normalizeLicense(l)))\n : \"\";\n\n // Extract repository URL\n const repository = normalizeRepositoryURL(\n data.source_code_uri ||\n (data.metadata?.source_code_uri as string) ||\n data.homepage_uri ||\n \"\",\n );\n\n return {\n name: data.name,\n description: data.description || \"\",\n homepage: data.homepage_uri || \"\",\n documentation: data.documentation_uri || \"\",\n repository,\n licenses,\n keywords: [],\n namespace: \"\",\n latestVersion: data.version || \"\",\n metadata: data.metadata || {},\n };\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"gem\", name);\n }\n throw error;\n }\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const url = `${this.baseURL}/api/v1/versions/${name}.json`;\n\n try {\n const data = await this.client.getJSON<RubyGemsVersionResponse[]>(url, signal);\n const versions: Version[] = [];\n\n for (const versionData of data) {\n const publishedAt = versionData.created_at ? new Date(versionData.created_at) : null;\n const status = versionData.yanked ? \"yanked\" : \"\";\n\n versions.push({\n number: versionData.number,\n publishedAt,\n licenses: \"\",\n integrity: versionData.sha ? `sha256-${versionData.sha}` : \"\",\n status,\n metadata: {},\n });\n }\n\n return versions;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"gem\", name);\n }\n throw error;\n }\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const url = `${this.baseURL}/api/v2/rubygems/${name}/versions/${version}.json`;\n\n try {\n const data = await this.client.getJSON<RubyGemsGemResponse>(url, signal);\n const dependencies: Dependency[] = [];\n\n // Runtime dependencies\n if (data.dependencies?.runtime) {\n for (const dep of data.dependencies.runtime) {\n dependencies.push({\n name: dep.name,\n requirements: dep.requirements,\n scope: \"runtime\",\n optional: false,\n });\n }\n }\n\n // Development dependencies\n if (data.dependencies?.development) {\n for (const dep of data.dependencies.development) {\n dependencies.push({\n name: dep.name,\n requirements: dep.requirements,\n scope: \"development\",\n optional: false,\n });\n }\n }\n\n return dependencies;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"gem\", name, version);\n }\n throw error;\n }\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const url = `${this.baseURL}/api/v1/gems/${name}/owners.json`;\n\n try {\n const data = await this.client.getJSON<RubyGemsOwnerResponse[]>(url, signal);\n const maintainers: Maintainer[] = [];\n\n for (const owner of data) {\n maintainers.push({\n uuid: \"\",\n login: owner.handle,\n name: owner.handle,\n email: owner.email || \"\",\n url: \"\",\n role: \"\",\n });\n }\n\n return maintainers;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"gem\", name);\n }\n throw error;\n }\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, version?: string) => {\n const base = `https://rubygems.org/gems/${name}`;\n return version ? `${base}/versions/${version}` : base;\n },\n download: (name: string, version: string) => {\n return `https://rubygems.org/downloads/${name}-${version}.gem`;\n },\n documentation: (name: string, version?: string) => {\n const versionSuffix = version ? `/${version}` : \"\";\n return `https://www.rubydoc.info/gems/${name}${versionSuffix}`;\n },\n readme: (name: string, version?: string) => {\n const base = `https://rubygems.org/gems/${name}`;\n return version ? `${base}/versions/${version}` : base;\n },\n purl: (name: string, version?: string) => {\n return buildPURL({ type: \"gem\", name, version });\n },\n };\n }\n}\n\nregister(\"gem\", \"https://rubygems.org\", RubyGemsRegistry);\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { HTTPError, NotFoundError, InvalidPURLError } from \"../core/errors.ts\";\nimport { combineLicenses } from \"../core/license.ts\";\nimport { normalizeRepositoryURL } from \"../core/repository.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\n\n/** Packagist API response for a single package. */\ninterface PackagistPackageResponse {\n package: {\n name: string;\n description: string;\n repository?: string;\n keywords?: string[];\n versions: Record<string, PackagistVersion>;\n };\n}\n\n/** Packagist version data. */\ninterface PackagistVersion {\n name: string;\n version: string;\n license?: string | string[];\n keywords?: string[];\n authors?: Array<{\n name?: string;\n email?: string;\n homepage?: string;\n role?: string;\n }>;\n require?: Record<string, string>;\n \"require-dev\"?: Record<string, string>;\n source?: {\n type?: string;\n url?: string;\n reference?: string;\n };\n dist?: {\n type?: string;\n url?: string;\n reference?: string;\n shasum?: string;\n };\n time?: string;\n}\n\n/** Packagist registry client. */\nexport class PackagistRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n ecosystem(): string {\n return \"composer\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const [vendor, pkg] = this.parseName(name);\n const url = `${this.baseURL}/packages/${vendor}/${pkg}.json`;\n\n try {\n const data = await this.client.getJSON<PackagistPackageResponse>(url, signal);\n const packageData = data.package;\n\n // Find latest version\n const versions = Object.keys(packageData.versions);\n const latestVersion = this.findLatestVersion(versions);\n\n // Get license from latest version\n const latestVersionData = packageData.versions[latestVersion];\n const licenses = this.extractLicenses(latestVersionData.license);\n\n return {\n name: packageData.name,\n description: packageData.description || \"\",\n homepage: \"\",\n documentation: \"\",\n repository: normalizeRepositoryURL(\n packageData.repository || latestVersionData.source?.url || \"\",\n ),\n licenses,\n keywords: packageData.keywords || [],\n namespace: vendor,\n latestVersion,\n metadata: {},\n };\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"composer\", name);\n }\n throw error;\n }\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const [vendor, pkg] = this.parseName(name);\n const url = `${this.baseURL}/packages/${vendor}/${pkg}.json`;\n\n try {\n const data = await this.client.getJSON<PackagistPackageResponse>(url, signal);\n const versions: Version[] = [];\n\n for (const [versionStr, versionData] of Object.entries(data.package.versions)) {\n const licenses = this.extractLicenses(versionData.license);\n const publishedAt = versionData.time ? new Date(versionData.time) : null;\n\n versions.push({\n number: versionStr,\n publishedAt,\n licenses,\n integrity: versionData.dist?.shasum ? `sha1-${versionData.dist.shasum}` : \"\",\n status: \"\",\n metadata: {},\n });\n }\n\n return versions;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"composer\", name);\n }\n throw error;\n }\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const [vendor, pkg] = this.parseName(name);\n const url = `${this.baseURL}/packages/${vendor}/${pkg}.json`;\n\n try {\n const data = await this.client.getJSON<PackagistPackageResponse>(url, signal);\n const versionData = data.package.versions[version];\n\n if (!versionData) {\n throw new NotFoundError(\"composer\", name, version);\n }\n\n const dependencies: Dependency[] = [];\n\n // Runtime dependencies\n if (versionData.require) {\n for (const [depName, requirements] of Object.entries(versionData.require)) {\n if (!this.shouldSkipDependency(depName)) {\n dependencies.push({\n name: depName,\n requirements,\n scope: \"runtime\",\n optional: false,\n });\n }\n }\n }\n\n // Development dependencies\n if (versionData[\"require-dev\"]) {\n for (const [depName, requirements] of Object.entries(versionData[\"require-dev\"])) {\n if (!this.shouldSkipDependency(depName)) {\n dependencies.push({\n name: depName,\n requirements,\n scope: \"development\",\n optional: false,\n });\n }\n }\n }\n\n return dependencies;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"composer\", name, version);\n }\n throw error;\n }\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const [vendor, pkg] = this.parseName(name);\n const url = `${this.baseURL}/packages/${vendor}/${pkg}.json`;\n\n try {\n const data = await this.client.getJSON<PackagistPackageResponse>(url, signal);\n const maintainers: Maintainer[] = [];\n const seen = new Set<string>();\n\n // Collect authors from all versions\n for (const versionData of Object.values(data.package.versions)) {\n if (versionData.authors) {\n for (const author of versionData.authors) {\n const key = `${author.name}:${author.email}`;\n if (!seen.has(key)) {\n seen.add(key);\n maintainers.push({\n uuid: \"\",\n login: author.email ? author.email.split(\"@\")[0] : \"\",\n name: author.name || \"\",\n email: author.email || \"\",\n url: author.homepage || \"\",\n role: author.role || \"\",\n });\n }\n }\n }\n }\n\n return maintainers;\n } catch (error) {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"composer\", name);\n }\n throw error;\n }\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, version?: string) => {\n const [vendor, pkg] = this.parseName(name);\n const base = `https://packagist.org/packages/${vendor}/${pkg}`;\n return version ? `${base}#${version}` : base;\n },\n download: (name: string, version: string) => {\n const [vendor, pkg] = this.parseName(name);\n return `https://repo.packagist.org/p/${vendor}/${pkg}/${version}.json`;\n },\n documentation: (name: string, _version?: string) => {\n const [vendor, pkg] = this.parseName(name);\n return `https://packagist.org/packages/${vendor}/${pkg}`;\n },\n readme: (name: string, _version?: string) => {\n const [vendor, pkg] = this.parseName(name);\n return `https://packagist.org/packages/${vendor}/${pkg}`;\n },\n purl: (name: string, version?: string) => {\n const [vendor, pkg] = this.parseName(name);\n return buildPURL({ type: \"composer\", namespace: vendor, name: pkg, version });\n },\n };\n }\n\n /** Parse \"vendor/package\" format. */\n private parseName(name: string): [string, string] {\n const parts = name.split(\"/\");\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new InvalidPURLError(\n `pkg:composer/${name}`,\n 'invalid Composer package name, expected \"vendor/package\" format',\n );\n }\n return [parts[0]!, parts[1]!];\n }\n\n /** Find the highest non-dev version. */\n private findLatestVersion(versions: string[]): string {\n // Filter out dev versions\n const stable = versions.filter((v) => !v.startsWith(\"dev-\") && !v.endsWith(\"-dev\"));\n if (stable.length === 0) {\n return versions[0] || \"\";\n }\n\n // Sort by semantic versioning (simplified)\n return (\n stable.sort((a, b) => {\n // Remove 'v' prefix if present\n const aClean = a.replace(/^v/, \"\");\n const bClean = b.replace(/^v/, \"\");\n\n // Try numeric comparison for simple versions\n const aParts = aClean.split(\".\").map((p) => Number.parseInt(p, 10));\n const bParts = bClean.split(\".\").map((p) => Number.parseInt(p, 10));\n\n for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n const aPart = aParts[i] ?? 0;\n const bPart = bParts[i] ?? 0;\n if (aPart !== bPart) {\n return bPart - aPart;\n }\n }\n\n return 0;\n })[0] ||\n versions[0] ||\n \"\"\n );\n }\n\n /** Extract and normalize licenses. */\n private extractLicenses(raw: string | string[] | undefined): string {\n if (!raw) return \"\";\n\n const licenses = Array.isArray(raw) ? raw : [raw];\n return combineLicenses(licenses);\n }\n\n /** Skip PHP and extension dependencies. */\n private shouldSkipDependency(name: string): boolean {\n return name === \"php\" || name.startsWith(\"ext-\");\n }\n}\n\nregister(\"composer\", \"https://packagist.org\", PackagistRegistry);\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { HTTPError, NotFoundError } from \"../core/errors.ts\";\nimport { combineLicenses } from \"../core/license.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\n\nconst AUR_BASE_URL = \"https://aur.archlinux.org\";\n\n/** Arch Linux official package search response. */\ninterface ArchSearchResponse {\n results: ArchPackageResult[];\n}\n\n/** Arch Linux official package data from search/detail endpoints. */\ninterface ArchPackageResult {\n pkgname: string;\n pkgbase: string;\n repo: string;\n arch: string;\n pkgver: string;\n pkgrel: string;\n epoch: number;\n pkgdesc: string;\n url: string;\n filename: string;\n compressed_size: number;\n installed_size: number;\n build_date: string;\n last_update: string;\n flag_date: string | null;\n maintainers: string[];\n packager: string;\n groups: string[];\n licenses: string[];\n conflicts: string[];\n provides: string[];\n replaces: string[];\n depends: string[];\n optdepends: string[];\n makedepends: string[];\n checkdepends: string[];\n}\n\n/** AUR RPC v5 response wrapper. */\ninterface AurResponse {\n resultcount: number;\n results: AurPackageResult[];\n type: string;\n version: number;\n}\n\n/** AUR package data. */\ninterface AurPackageResult {\n ID: number;\n Name: string;\n PackageBase: string;\n PackageBaseID: number;\n Version: string;\n Description: string;\n URL: string;\n NumVotes: number;\n Popularity: number;\n OutOfDate: number | null;\n Maintainer: string | null;\n FirstSubmitted: number;\n LastModified: number;\n URLPath: string;\n Depends?: string[];\n OptDepends?: string[];\n MakeDepends?: string[];\n CheckDepends?: string[];\n License?: string[];\n Keywords?: string[];\n}\n\n/** ALPM registry client — routes to Arch Linux official repos or AUR based on namespace. */\nexport class AlpmRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n ecosystem(): string {\n return \"alpm\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const { namespace, pkgName } = this.parseName(name);\n this.assertSupportedNamespace(namespace, name);\n\n if (namespace === \"aur\") {\n return this.fetchAurPackage(pkgName, signal);\n }\n\n return this.fetchOfficialPackage(pkgName, signal);\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const { namespace, pkgName } = this.parseName(name);\n this.assertSupportedNamespace(namespace, name);\n\n if (namespace === \"aur\") {\n return this.fetchAurVersions(pkgName, signal);\n }\n\n return this.fetchOfficialVersions(pkgName, signal);\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const { namespace, pkgName } = this.parseName(name);\n this.assertSupportedNamespace(namespace, name);\n\n if (namespace === \"aur\") {\n return this.fetchAurDependencies(pkgName, version, signal);\n }\n\n return this.fetchOfficialDependencies(pkgName, version, signal);\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const { namespace, pkgName } = this.parseName(name);\n this.assertSupportedNamespace(namespace, name);\n\n if (namespace === \"aur\") {\n return this.fetchAurMaintainers(pkgName, signal);\n }\n\n return this.fetchOfficialMaintainers(pkgName, signal);\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, _version?: string) => {\n const { namespace, pkgName } = this.parseName(name);\n if (namespace === \"aur\") {\n return `https://aur.archlinux.org/packages/${pkgName}`;\n }\n return `https://archlinux.org/packages/?name=${pkgName}`;\n },\n download: (name: string, _version: string) => {\n const { namespace, pkgName } = this.parseName(name);\n if (namespace === \"aur\") {\n return `https://aur.archlinux.org/cgit/aur.git/snapshot/${pkgName}.tar.gz`;\n }\n const letter = pkgName.charAt(0);\n return `https://archive.archlinux.org/packages/${letter}/${pkgName}/`;\n },\n documentation: (name: string, _version?: string) => {\n const { namespace, pkgName } = this.parseName(name);\n if (namespace === \"aur\") {\n return `https://aur.archlinux.org/packages/${pkgName}`;\n }\n return `https://wiki.archlinux.org/title/${pkgName}`;\n },\n readme: (_name: string, _version?: string) => {\n return \"\";\n },\n purl: (name: string, version?: string) => {\n const { namespace, pkgName } = this.parseName(name);\n return buildPURL({ type: \"alpm\", namespace, name: pkgName, version });\n },\n };\n }\n\n // --- Official Arch Linux API ---\n\n private async fetchOfficialPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const result = await this.searchOfficial(name, signal);\n\n return {\n name: result.pkgname,\n description: result.pkgdesc || \"\",\n homepage: result.url || \"\",\n documentation: \"\",\n repository: \"\",\n licenses: combineLicenses(result.licenses),\n keywords: result.groups,\n namespace: \"arch\",\n latestVersion: this.formatVersion(result),\n metadata: {\n repo: result.repo,\n arch: result.arch,\n pkgbase: result.pkgbase,\n compressedSize: result.compressed_size,\n installedSize: result.installed_size,\n buildDate: result.build_date,\n lastUpdate: result.last_update,\n flagDate: result.flag_date,\n packager: result.packager,\n provides: result.provides,\n conflicts: result.conflicts,\n replaces: result.replaces,\n },\n };\n }\n\n private async fetchOfficialVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const result = await this.searchOfficial(name, signal);\n\n return [\n {\n number: this.formatVersion(result),\n publishedAt: result.last_update ? new Date(result.last_update) : null,\n licenses: combineLicenses(result.licenses),\n integrity: \"\",\n status: result.flag_date ? \"deprecated\" : \"\",\n metadata: {\n repo: result.repo,\n arch: result.arch,\n },\n },\n ];\n }\n\n private async fetchOfficialDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const result = await this.searchOfficial(name, signal);\n const currentVersion = this.formatVersion(result);\n this.assertVersionMatches(name, version, currentVersion);\n\n return this.buildDependencies(\n result.depends,\n result.makedepends,\n result.optdepends,\n result.checkdepends,\n );\n }\n\n private async fetchOfficialMaintainers(\n name: string,\n signal?: AbortSignal,\n ): Promise<Maintainer[]> {\n const result = await this.searchOfficial(name, signal);\n\n return result.maintainers.map((m) => ({\n uuid: \"\",\n login: m,\n name: m,\n email: \"\",\n url: \"\",\n role: \"maintainer\",\n }));\n }\n\n /** Search official repos by exact package name. Prefers x86_64 results. */\n private async searchOfficial(name: string, signal?: AbortSignal): Promise<ArchPackageResult> {\n const url = `${this.baseURL}/packages/search/json/?name=${encodeURIComponent(name)}`;\n\n try {\n const data = await this.client.getJSON<ArchSearchResponse>(url, signal);\n\n if (!data.results || data.results.length === 0) {\n throw new NotFoundError(\"alpm\", name);\n }\n\n // Prefer x86_64 arch, fall back to first result\n return data.results.find((r) => r.arch === \"x86_64\") || data.results[0]!;\n } catch (error) {\n if (error instanceof NotFoundError) throw error;\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"alpm\", name);\n }\n throw error;\n }\n }\n\n // --- AUR API ---\n\n private async fetchAurPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const result = await this.fetchAurInfo(name, signal);\n\n return {\n name: result.Name,\n description: result.Description || \"\",\n homepage: result.URL || \"\",\n documentation: \"\",\n repository: \"\",\n licenses: combineLicenses(result.License || []),\n keywords: result.Keywords || [],\n namespace: \"aur\",\n latestVersion: result.Version,\n metadata: {\n votes: result.NumVotes,\n popularity: result.Popularity,\n outOfDate: result.OutOfDate,\n pkgbase: result.PackageBase,\n firstSubmitted: result.FirstSubmitted,\n lastModified: result.LastModified,\n },\n };\n }\n\n private async fetchAurVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const result = await this.fetchAurInfo(name, signal);\n\n return [\n {\n number: result.Version,\n publishedAt: result.LastModified ? new Date(result.LastModified * 1000) : null,\n licenses: combineLicenses(result.License || []),\n integrity: \"\",\n status: result.OutOfDate ? \"deprecated\" : \"\",\n metadata: {\n votes: result.NumVotes,\n popularity: result.Popularity,\n },\n },\n ];\n }\n\n private async fetchAurDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const result = await this.fetchAurInfo(name, signal);\n this.assertVersionMatches(`aur/${name}`, version, result.Version);\n\n return this.buildDependencies(\n result.Depends || [],\n result.MakeDepends || [],\n result.OptDepends || [],\n result.CheckDepends || [],\n );\n }\n\n private async fetchAurMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const result = await this.fetchAurInfo(name, signal);\n\n if (!result.Maintainer) return [];\n\n return [\n {\n uuid: \"\",\n login: result.Maintainer,\n name: result.Maintainer,\n email: \"\",\n url: \"\",\n role: \"maintainer\",\n },\n ];\n }\n\n /** Fetch package info from AUR RPC v5. */\n private async fetchAurInfo(name: string, signal?: AbortSignal): Promise<AurPackageResult> {\n const url = `${AUR_BASE_URL}/rpc/v5/info/${encodeURIComponent(name)}`;\n\n try {\n const data = await this.client.getJSON<AurResponse>(url, signal);\n\n if (!data.results || data.results.length === 0) {\n throw new NotFoundError(\"alpm\", `aur/${name}`);\n }\n\n return data.results[0]!;\n } catch (error) {\n if (error instanceof NotFoundError) throw error;\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(\"alpm\", `aur/${name}`);\n }\n throw error;\n }\n }\n\n // --- Shared helpers ---\n\n /** Parse \"namespace/name\" into components. Defaults to \"arch\" namespace. */\n private parseName(fullName: string): { namespace: string; pkgName: string } {\n const normalized = fullName.trim().toLowerCase();\n const slashIdx = normalized.indexOf(\"/\");\n if (slashIdx === -1) {\n return { namespace: \"arch\", pkgName: normalized };\n }\n return {\n namespace: normalized.slice(0, slashIdx),\n pkgName: normalized.slice(slashIdx + 1),\n };\n }\n\n private assertSupportedNamespace(namespace: string, requestedName: string): void {\n if (namespace !== \"arch\" && namespace !== \"aur\") {\n throw new NotFoundError(\"alpm\", requestedName);\n }\n }\n\n private assertVersionMatches(name: string, requested: string, current: string): void {\n if (requested && requested !== current) {\n throw new NotFoundError(\"alpm\", name, requested);\n }\n }\n\n /** Format ALPM version: epoch:pkgver-pkgrel (epoch omitted when 0). */\n private formatVersion(result: ArchPackageResult): string {\n const epoch = result.epoch && result.epoch > 0 ? `${result.epoch}:` : \"\";\n return `${epoch}${result.pkgver}-${result.pkgrel}`;\n }\n\n /** Build normalized dependency list from ALPM dependency arrays. */\n private buildDependencies(\n depends: string[],\n makedepends: string[],\n optdepends: string[],\n checkdepends: string[],\n ): Dependency[] {\n const dependencies: Dependency[] = [];\n\n for (const dep of depends) {\n const parsed = this.parseDep(dep);\n dependencies.push({\n name: parsed.name,\n requirements: parsed.requirements,\n scope: \"runtime\",\n optional: false,\n });\n }\n\n for (const dep of makedepends) {\n const parsed = this.parseDep(dep);\n dependencies.push({\n name: parsed.name,\n requirements: parsed.requirements,\n scope: \"build\",\n optional: false,\n });\n }\n\n for (const dep of optdepends) {\n const parsed = this.parseOptDep(dep);\n dependencies.push({\n name: parsed.name,\n requirements: parsed.requirements,\n scope: \"optional\",\n optional: true,\n });\n }\n\n for (const dep of checkdepends) {\n const parsed = this.parseDep(dep);\n dependencies.push({\n name: parsed.name,\n requirements: parsed.requirements,\n scope: \"test\",\n optional: false,\n });\n }\n\n return dependencies;\n }\n\n /** Parse a dependency string like \"glibc>=2.33\" or \"bash\". */\n private parseDep(dep: string): { name: string; requirements: string } {\n const match = dep.match(/^([a-zA-Z0-9@._+-]+)(.*)$/);\n if (!match) return { name: dep, requirements: \"\" };\n return {\n name: match[1]!,\n requirements: match[2]!.trim(),\n };\n }\n\n /** Parse optional dependency like \"perl-locale-gettext: translation support\". */\n private parseOptDep(dep: string): { name: string; requirements: string; description: string } {\n const colonIdx = dep.indexOf(\":\");\n if (colonIdx === -1) {\n const parsed = this.parseDep(dep.trim());\n return { name: parsed.name, requirements: parsed.requirements, description: \"\" };\n }\n const parsed = this.parseDep(dep.slice(0, colonIdx).trim());\n\n return {\n name: parsed.name,\n requirements: parsed.requirements,\n description: dep.slice(colonIdx + 1).trim(),\n };\n }\n}\n\nregister(\"alpm\", \"https://archlinux.org\", AlpmRegistry);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registries.mjs","names":[],"sources":["../../src/core/license.ts","../../src/core/repository.ts","../../src/core/purl.ts","../../src/registries/error.ts","../../src/registries/npm.ts","../../src/registries/cargo.ts","../../src/registries/pypi.ts","../../src/registries/rubygems.ts","../../src/registries/packagist.ts","../../src/registries/alpm.ts"],"sourcesContent":["/**\n * Normalize common license names to SPDX expressions.\n *\n * @param raw - License name or SPDX expression.\n * @returns {string} The normalized SPDX expression, or an empty string.\n */\nexport function normalizeLicense(raw: string | null | undefined): string {\n if (!raw) return \"\";\n\n const trimmed = raw.trim();\n if (!trimmed) return \"\";\n\n // Common mappings\n const lower = trimmed.toLowerCase();\n const known = LICENSE_MAP.get(lower);\n if (known) return known;\n\n // Already looks like SPDX — return as-is\n return trimmed;\n}\n\nconst LICENSE_MAP = new Map<string, string>([\n [\"mit license\", \"MIT\"],\n [\"mit\", \"MIT\"],\n [\"apache license 2.0\", \"Apache-2.0\"],\n [\"apache 2.0\", \"Apache-2.0\"],\n [\"apache-2.0\", \"Apache-2.0\"],\n [\"apache license, version 2.0\", \"Apache-2.0\"],\n [\"apache2\", \"Apache-2.0\"],\n [\"bsd-2-clause\", \"BSD-2-Clause\"],\n [\"bsd-3-clause\", \"BSD-3-Clause\"],\n [\"bsd 2-clause\", \"BSD-2-Clause\"],\n [\"bsd 3-clause\", \"BSD-3-Clause\"],\n [\"simplified bsd license\", \"BSD-2-Clause\"],\n [\"new bsd license\", \"BSD-3-Clause\"],\n [\"isc license\", \"ISC\"],\n [\"isc\", \"ISC\"],\n [\"gpl-2.0\", \"GPL-2.0-only\"],\n [\"gpl-3.0\", \"GPL-3.0-only\"],\n [\"gpl-2.0-only\", \"GPL-2.0-only\"],\n [\"gpl-3.0-only\", \"GPL-3.0-only\"],\n [\"lgpl-2.1\", \"LGPL-2.1-only\"],\n [\"lgpl-3.0\", \"LGPL-3.0-only\"],\n [\"mpl-2.0\", \"MPL-2.0\"],\n [\"mozilla public license 2.0\", \"MPL-2.0\"],\n [\"unlicense\", \"Unlicense\"],\n [\"the unlicense\", \"Unlicense\"],\n [\"cc0-1.0\", \"CC0-1.0\"],\n [\"cc0\", \"CC0-1.0\"],\n [\"public domain\", \"Unlicense\"],\n [\"zlib\", \"Zlib\"],\n [\"wtfpl\", \"WTFPL\"],\n [\"artistic-2.0\", \"Artistic-2.0\"],\n [\"boost software license 1.0\", \"BSL-1.0\"],\n [\"bsl-1.0\", \"BSL-1.0\"],\n]);\n\n/**\n * Combine license strings into one SPDX expression.\n *\n * @param licenses - License names or expressions to normalize.\n * @param operator - SPDX operator joining multiple licenses.\n * @returns {string} The combined SPDX expression, or an empty string.\n */\nexport function combineLicenses(\n licenses: readonly (string | null | undefined)[],\n operator: \"OR\" | \"AND\" = \"OR\",\n): string {\n const normalized = licenses.map((l) => normalizeLicense(l)).filter(Boolean);\n\n if (normalized.length === 0) return \"\";\n if (normalized.length === 1) return normalized[0]!;\n return normalized.join(` ${operator} `);\n}\n","type PrefixReplacement = readonly [prefix: string, replacement: string];\n\nconst REPOSITORY_SHORTHANDS: readonly PrefixReplacement[] = [\n [\"github:\", \"https://github.com/\"],\n [\"gitlab:\", \"https://gitlab.com/\"],\n [\"bitbucket:\", \"https://bitbucket.org/\"],\n];\n\nconst GIT_TRANSPORTS: readonly PrefixReplacement[] = [\n [\"git://\", \"https://\"],\n [\"ssh://git@\", \"https://\"],\n];\n\nfunction extractRepositoryURL(raw: unknown): string {\n if (typeof raw === \"string\") return raw;\n if (typeof raw !== \"object\" || raw === null) return \"\";\n\n const url = (raw as Record<string, unknown>)[\"url\"];\n return typeof url === \"string\" ? url : \"\";\n}\n\nfunction replacePrefix(value: string, replacements: readonly PrefixReplacement[]): string {\n for (const [prefix, replacement] of replacements) {\n if (value.startsWith(prefix)) return replacement + value.slice(prefix.length);\n }\n return value;\n}\n\n/**\n * Normalize repository shorthands and Git transports to HTTPS.\n *\n * @param raw - Repository URL string or object with a URL field.\n * @returns {string} The normalized URL, or an empty string.\n */\nexport function normalizeRepositoryURL(raw: unknown): string {\n let url = extractRepositoryURL(raw).trim();\n if (!url) return \"\";\n\n url = replacePrefix(url, REPOSITORY_SHORTHANDS);\n if (url.startsWith(\"git+\")) url = url.slice(4);\n url = replacePrefix(url, GIT_TRANSPORTS);\n\n const sshMatch = url.match(/^git@([^:]+):(.+)$/);\n if (sshMatch) url = `https://${sshMatch[1]}/${sshMatch[2]}`;\n\n return url.replace(/\\/$/, \"\").replace(/\\.git$/, \"\");\n}\n","import type { ParsedPURL } from \"./types.ts\";\nimport type { Client } from \"./client.ts\";\nimport { create, type Registry } from \"./registry.ts\";\nimport { InvalidPURLError } from \"./errors.ts\";\n\nconst QUALIFIER_KEY_PATTERN = /^[a-z][a-z0-9._-]*$/;\n\nfunction decodePURLComponent(purlStr: string, value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n throw new InvalidPURLError(purlStr, \"malformed percent-encoding\");\n }\n}\n\nfunction extractSubpath(purlStr: string, value: string): { remainder: string; subpath: string } {\n const hashIdx = value.indexOf(\"#\");\n if (hashIdx === -1) return { remainder: value, subpath: \"\" };\n\n const subpath = value\n .slice(hashIdx + 1)\n .split(\"/\")\n .map((segment) => decodePURLComponent(purlStr, segment))\n .join(\"/\");\n return { remainder: value.slice(0, hashIdx), subpath };\n}\n\nfunction extractQualifiers(\n purlStr: string,\n value: string,\n): { qualifiers: Record<string, string>; remainder: string } {\n const queryIdx = value.indexOf(\"?\");\n if (queryIdx === -1) return { qualifiers: {}, remainder: value };\n\n const qualifiers: Record<string, string> = {};\n for (const pair of value.slice(queryIdx + 1).split(\"&\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx !== -1) {\n qualifiers[decodePURLComponent(purlStr, pair.slice(0, eqIdx))] = decodePURLComponent(\n purlStr,\n pair.slice(eqIdx + 1),\n );\n }\n }\n return { qualifiers, remainder: value.slice(0, queryIdx) };\n}\n\nfunction extractVersion(purlStr: string, value: string): { remainder: string; version: string } {\n const lastSlashIdx = value.lastIndexOf(\"/\");\n const lastAtIdx = value.lastIndexOf(\"@\");\n if (lastAtIdx === -1 || lastAtIdx <= lastSlashIdx) return { remainder: value, version: \"\" };\n\n return {\n remainder: value.slice(0, lastAtIdx),\n version: decodePURLComponent(purlStr, value.slice(lastAtIdx + 1)),\n };\n}\n\n/**\n * Parse a package URL into normalized components.\n *\n * @param purlStr - Package URL to parse.\n * @returns {ParsedPURL} The normalized components.\n * @see https://github.com/package-url/purl-spec (ECMA-427)\n */\nexport function parsePURL(purlStr: string): ParsedPURL {\n if (!purlStr.startsWith(\"pkg:\")) {\n throw new InvalidPURLError(purlStr, 'must start with \"pkg:\"');\n }\n\n const subpathParts = extractSubpath(purlStr, purlStr.slice(4));\n const qualifierParts = extractQualifiers(purlStr, subpathParts.remainder);\n const versionParts = extractVersion(purlStr, qualifierParts.remainder);\n const remainder = versionParts.remainder;\n\n // Extract type\n const slashIdx = remainder.indexOf(\"/\");\n if (slashIdx === -1) {\n throw new InvalidPURLError(purlStr, \"missing type/name separator\");\n }\n\n const type = remainder.slice(0, slashIdx).toLowerCase();\n if (!type) {\n throw new InvalidPURLError(purlStr, \"empty type\");\n }\n\n const rest = remainder.slice(slashIdx + 1);\n if (!rest) {\n throw new InvalidPURLError(purlStr, \"empty name\");\n }\n\n // Extract namespace and name\n const lastSlashIdx = rest.lastIndexOf(\"/\");\n let namespace = \"\";\n let name: string;\n\n if (lastSlashIdx !== -1) {\n namespace = rest\n .slice(0, lastSlashIdx)\n .split(\"/\")\n .map((s) => decodePURLComponent(purlStr, s))\n .join(\"/\");\n name = decodePURLComponent(purlStr, rest.slice(lastSlashIdx + 1));\n } else {\n name = decodePURLComponent(purlStr, rest);\n }\n\n // Ecosystem-specific normalization per PURL spec\n if (type === \"pypi\") {\n name = name.toLowerCase().replaceAll(/[-_.]+/g, \"-\");\n }\n\n if (type === \"alpm\") {\n name = name.toLowerCase();\n }\n\n return {\n type,\n namespace,\n name,\n version: versionParts.version,\n qualifiers: qualifierParts.qualifiers,\n subpath: subpathParts.subpath,\n };\n}\n\n/**\n * Build a registry package name from PURL components.\n *\n * @param parsed - Parsed package URL components.\n * @returns {string} The namespace-qualified package name.\n */\nexport function fullName(parsed: ParsedPURL): string {\n if (parsed.namespace) {\n return `${parsed.namespace}/${parsed.name}`;\n }\n return parsed.name;\n}\n\n/**\n * Create a registry from a package URL.\n *\n * @param purlStr - Package URL to resolve.\n * @param client - Optional HTTP client.\n * @returns {[Registry, string, string]} The registry, package name, and version.\n */\nexport function createFromPURL(purlStr: string, client?: Client): [Registry, string, string] {\n const parsed = parsePURL(purlStr);\n const baseURL = parsed.qualifiers[\"repository_url\"] ?? \"\";\n const reg = create(parsed.type, baseURL || undefined, client);\n return [reg, fullName(parsed), parsed.version];\n}\n\n/**\n * Build a package URL from normalized components.\n *\n * @param parts - Package URL components.\n * @returns {string} The canonical package URL.\n */\nexport function buildPURL(\n parts: Readonly<{\n type: string;\n name: string;\n version?: string;\n namespace?: string;\n qualifiers?: Readonly<Record<string, string>>;\n subpath?: string;\n }>,\n): string {\n let purl = `pkg:${parts.type}/`;\n if (parts.namespace) {\n purl += `${parts.namespace\n .split(\"/\")\n .map((s) => encodeURIComponent(s))\n .join(\"/\")}/`;\n }\n purl += encodeURIComponent(parts.name);\n if (parts.version) {\n purl += `@${encodeURIComponent(parts.version)}`;\n }\n if (parts.qualifiers && Object.keys(parts.qualifiers).length > 0) {\n const qualifiers = new Map<string, string>();\n for (const [key, value] of Object.entries(parts.qualifiers)) {\n const canonicalKey = key.toLowerCase();\n if (!QUALIFIER_KEY_PATTERN.test(canonicalKey)) {\n throw new InvalidPURLError(purl, `invalid qualifier key \"${key}\"`);\n }\n if (qualifiers.has(canonicalKey)) {\n throw new InvalidPURLError(purl, `duplicate qualifier key \"${canonicalKey}\"`);\n }\n qualifiers.set(canonicalKey, value);\n }\n const qs = [...qualifiers]\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n .join(\"&\");\n purl += `?${qs}`;\n }\n if (parts.subpath) {\n purl += `#${parts.subpath\n .split(\"/\")\n .map((s) => encodeURIComponent(s))\n .join(\"/\")}`;\n }\n return purl;\n}\n","import { HTTPError, NotFoundError } from \"../core/errors.ts\";\n\nexport function rethrowFetchError(\n error: unknown,\n ecosystem: string,\n packageName: string,\n version = \"\",\n): never {\n if (error instanceof HTTPError && error.isNotFound()) {\n throw new NotFoundError(ecosystem, packageName, version);\n }\n throw error;\n}\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { normalizeLicense } from \"../core/license.ts\";\nimport { normalizeRepositoryURL } from \"../core/repository.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\nimport { rethrowFetchError } from \"./error.ts\";\n\ninterface NpmPerson {\n readonly name?: string;\n readonly email?: string;\n readonly url?: string;\n}\n\n/** npm registry API response for a single package. */\ninterface NpmPackageResponse {\n name: string;\n description?: string;\n homepage?: string;\n repository?:\n | {\n type?: string;\n url?: string;\n }\n | string;\n license?:\n | string\n | {\n type?: string;\n };\n keywords?: string[];\n \"dist-tags\": {\n latest: string;\n };\n versions: Record<string, NpmVersion>;\n maintainers?: readonly NpmPerson[];\n time?: Record<string, string>;\n}\n\n/** npm version data. */\ninterface NpmVersion {\n name: string;\n version: string;\n description?: string;\n license?:\n | string\n | {\n type?: string;\n };\n keywords?: string[];\n author?: NpmPerson;\n contributors?: readonly NpmPerson[];\n maintainers?: readonly NpmPerson[];\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n dist?: {\n integrity?: string;\n shasum?: string;\n tarball?: string;\n };\n deprecated?: boolean | string;\n}\n\n/** npm registry client. */\nexport class NpmRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n ecosystem(): string {\n return \"npm\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const encodedName = this.encodeName(name);\n const url = `${this.baseURL}/${encodedName}`;\n\n try {\n const data = await this.client.getJSON<NpmPackageResponse>(url, signal);\n\n const latestVersion = data[\"dist-tags\"].latest;\n const latestVersionData = data.versions[latestVersion];\n\n const licenses = data.license\n ? this.extractLicense(data.license)\n : this.extractLicense(latestVersionData?.license);\n const namespace = this.extractNamespace(name);\n\n return {\n name: data.name,\n description: data.description || \"\",\n homepage: data.homepage || \"\",\n documentation: \"\",\n repository: normalizeRepositoryURL(data.repository || \"\"),\n licenses,\n keywords: data.keywords ?? [],\n namespace,\n latestVersion,\n metadata: {},\n };\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const encodedName = this.encodeName(name);\n const url = `${this.baseURL}/${encodedName}`;\n\n try {\n const data = await this.client.getJSON<NpmPackageResponse>(url, signal);\n\n return Object.entries(data.versions).map(([versionStr, versionData]) => {\n const licenses = this.extractLicense(versionData.license);\n const publishedAt = data.time?.[versionStr] ? new Date(data.time[versionStr]) : null;\n const status = versionData.deprecated ? \"deprecated\" : \"\";\n const integrity = versionData.dist?.integrity\n ? versionData.dist.integrity\n : versionData.dist?.shasum\n ? `sha1-${versionData.dist.shasum}`\n : \"\";\n\n return {\n number: versionStr,\n publishedAt,\n licenses,\n integrity,\n status,\n metadata: {},\n };\n });\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const encodedName = this.encodeName(name);\n const url = `${this.baseURL}/${encodedName}/${version}`;\n\n try {\n const versionData = await this.client.getJSON<NpmVersion>(url, signal);\n const optionalNames = Object.keys(versionData.optionalDependencies ?? {});\n\n return [\n ...this.mapDependencies(versionData.dependencies, \"runtime\", false, optionalNames),\n ...this.mapDependencies(versionData.devDependencies, \"development\", false),\n ...this.mapDependencies(versionData.optionalDependencies, \"runtime\", true),\n ...this.mapDependencies(versionData.peerDependencies, \"runtime\", false),\n ];\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name, version);\n }\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const encodedName = this.encodeName(name);\n const url = `${this.baseURL}/${encodedName}`;\n\n try {\n const data = await this.client.getJSON<NpmPackageResponse>(url, signal);\n const latestVersion = data.versions[data[\"dist-tags\"].latest];\n\n return this.collectMaintainers(\n data.maintainers,\n latestVersion?.author,\n latestVersion?.contributors,\n );\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, version?: string) => {\n const base = `https://www.npmjs.com/package/${name}`;\n return version ? `${base}/v/${version}` : base;\n },\n download: (name: string, version: string) => {\n const encodedName = this.encodeName(name);\n const tarballName = name.includes(\"/\") ? name.split(\"/\")[1] : name;\n return `https://registry.npmjs.org/${encodedName}/-/${tarballName}-${version}.tgz`;\n },\n documentation: (name: string, _version?: string) => {\n return `https://www.npmjs.com/package/${name}`;\n },\n readme: (name: string, version?: string) => {\n const ver = version ? `@${version}` : \"\";\n return `https://cdn.jsdelivr.net/npm/${name}${ver}/README.md`;\n },\n purl: (name: string, version?: string) => {\n const namespace = this.extractNamespace(name);\n const bareName = namespace ? name.slice(namespace.length + 1) : name;\n return buildPURL({ type: \"npm\", namespace, name: bareName, version });\n },\n };\n }\n\n private mapDependencies(\n entries: Readonly<Record<string, string>> | undefined,\n scope: Dependency[\"scope\"],\n optional: boolean,\n excluded: readonly string[] = [],\n ): Dependency[] {\n const dependencies: Dependency[] = [];\n\n for (const [name, requirements] of Object.entries(entries ?? {})) {\n if (excluded.includes(name)) continue;\n dependencies.push({ name, requirements, scope, optional });\n }\n\n return dependencies;\n }\n\n private collectMaintainers(\n maintainers: readonly NpmPerson[] | undefined,\n author: Readonly<NpmPerson> | undefined,\n contributors: readonly NpmPerson[] | undefined,\n ): Maintainer[] {\n const candidates: Array<readonly [NpmPerson, string]> = [\n ...(maintainers ?? []).map((maintainer) => [maintainer, \"\"] as const),\n ...(author ? [[author, \"author\"] as const] : []),\n ...(contributors ?? []).map((contributor) => [contributor, \"contributor\"] as const),\n ];\n const seen = new Set<string>();\n const result: Maintainer[] = [];\n\n for (const [maintainer, role] of candidates) {\n const key = this.maintainerKey(maintainer.name, maintainer.email);\n if (!key || seen.has(key)) continue;\n seen.add(key);\n result.push(this.toMaintainer(maintainer, role));\n }\n\n return result;\n }\n\n private toMaintainer(maintainer: Readonly<NpmPerson>, role: string): Maintainer {\n return {\n uuid: \"\",\n login: maintainer.email ? maintainer.email.split(\"@\")[0] : \"\",\n name: maintainer.name || \"\",\n email: maintainer.email || \"\",\n url: maintainer.url || \"\",\n role,\n };\n }\n\n private maintainerKey(name: string | undefined, email: string | undefined): string {\n if (email) return email;\n if (name) return name;\n return \"\";\n }\n\n private encodeName(name: string): string {\n if (name.startsWith(\"@\")) {\n return name.replace(\"/\", \"%2F\");\n }\n return name;\n }\n\n private extractNamespace(name: string): string {\n if (name.startsWith(\"@\")) {\n const parts = name.split(\"/\");\n return parts[0] || \"\";\n }\n return \"\";\n }\n\n private extractLicense(raw: string | Readonly<{ type?: string }> | undefined): string {\n if (!raw) return \"\";\n\n if (typeof raw === \"string\") {\n return normalizeLicense(raw);\n }\n\n if (typeof raw === \"object\" && raw !== null) {\n const obj = raw as Record<string, unknown>;\n if (typeof obj[\"type\"] === \"string\") {\n return normalizeLicense(obj[\"type\"]);\n }\n }\n\n return \"\";\n }\n}\n\nregister(\"npm\", \"https://registry.npmjs.org\", NpmRegistry);\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { normalizeLicense } from \"../core/license.ts\";\nimport { normalizeRepositoryURL } from \"../core/repository.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\nimport { rethrowFetchError } from \"./error.ts\";\n\n/** Crates.io API response for a single crate. */\ninterface CratesPackageResponse {\n crate: {\n id: number;\n name: string;\n updated_at: string;\n created_at: string;\n downloads: number;\n recent_downloads: number;\n max_version: string;\n max_stable_version: string;\n newest_version: string;\n description: string;\n homepage: string;\n documentation: string;\n repository: string;\n keywords: string[];\n categories: Array<{\n id: string;\n category: string;\n created_at: string;\n }>;\n badges: unknown[];\n links: Record<string, string>;\n };\n versions: CratesVersion[];\n}\n\n/** Crates.io version data. */\ninterface CratesVersion {\n id: number;\n num: string;\n dl_path: string;\n readme_path: string;\n created_at: string;\n updated_at: string;\n downloads: number;\n features: Record<string, string[]>;\n yanked: boolean;\n license: string;\n links: Record<string, string>;\n crate_size: number;\n published_by: {\n id: number;\n login: string;\n name: string;\n avatar: string;\n url: string;\n };\n checksum: string;\n}\n\n/** Crates.io dependencies response. */\ninterface CratesDependenciesResponse {\n dependencies: CratesDependency[];\n meta: {\n prelude: boolean;\n };\n}\n\n/** Crates.io dependency data. */\ninterface CratesDependency {\n id: number;\n version_id: number;\n crate_id: string;\n req: string;\n optional: boolean;\n default_features: boolean;\n features: string[];\n target: string | null;\n kind: string;\n downloads: number;\n}\n\n/** Crates.io maintainers response. */\ninterface CratesMaintainersResponse {\n users: CratesMaintainer[];\n}\n\n/** Crates.io maintainer data. */\ninterface CratesMaintainer {\n id: number;\n login: string;\n name: string;\n avatar: string;\n url: string;\n}\n\nfunction preferNonEmpty(value: string, fallback: string): string {\n return value || fallback;\n}\n\n/** Crates.io registry client. */\nexport class CargoRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n ecosystem(): string {\n return \"cargo\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const url = `${this.baseURL}/api/v1/crates/${name}`;\n\n try {\n const data = await this.client.getJSON<CratesPackageResponse>(url, signal);\n const crateData = data.crate;\n const latestVersion = preferNonEmpty(crateData.max_stable_version, crateData.max_version);\n const latestVersionData = data.versions.find((v) => v.num === latestVersion);\n\n return {\n name: crateData.name,\n description: crateData.description || \"\",\n homepage: crateData.homepage || \"\",\n documentation: crateData.documentation || \"\",\n repository: normalizeRepositoryURL(crateData.repository || \"\"),\n licenses: normalizeLicense(\n latestVersionData ? latestVersionData.license : (data.versions[0]?.license ?? \"\"),\n ),\n keywords: crateData.keywords,\n namespace: \"\",\n latestVersion,\n metadata: {\n downloads: crateData.downloads,\n recentDownloads: crateData.recent_downloads,\n categories: crateData.categories,\n newestVersion: crateData.newest_version,\n defaultVersion: crateData.max_version,\n updatedAt: crateData.updated_at,\n createdAt: crateData.created_at,\n },\n };\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const url = `${this.baseURL}/api/v1/crates/${name}`;\n\n try {\n const data = await this.client.getJSON<CratesPackageResponse>(url, signal);\n const versions: Version[] = [];\n\n for (const versionData of data.versions) {\n const publishedAt = new Date(versionData.created_at);\n const status = versionData.yanked ? \"yanked\" : \"\";\n\n versions.push({\n number: versionData.num,\n publishedAt,\n licenses: normalizeLicense(versionData.license),\n integrity: `sha256-${versionData.checksum}`,\n status,\n metadata: {\n crateSize: versionData.crate_size,\n features: versionData.features,\n downloads: versionData.downloads,\n },\n });\n }\n\n return versions;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const url = `${this.baseURL}/api/v1/crates/${name}/${version}/dependencies`;\n\n try {\n const data = await this.client.getJSON<CratesDependenciesResponse>(url, signal);\n const dependencies: Dependency[] = [];\n\n for (const dep of data.dependencies) {\n let scope: \"runtime\" | \"development\" | \"test\" | \"build\" | \"optional\";\n\n if (dep.kind === \"dev\") {\n scope = \"development\";\n } else if (dep.kind === \"build\") {\n scope = \"build\";\n } else {\n scope = \"runtime\";\n }\n\n dependencies.push({\n name: dep.crate_id,\n requirements: dep.req,\n scope,\n optional: dep.optional,\n });\n }\n\n return dependencies;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name, version);\n }\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const url = `${this.baseURL}/api/v1/crates/${name}/owner_user`;\n\n try {\n const data = await this.client.getJSON<CratesMaintainersResponse>(url, signal);\n const maintainers: Maintainer[] = [];\n\n for (const user of data.users) {\n maintainers.push({\n uuid: user.id.toString(),\n login: user.login,\n name: user.name,\n email: \"\",\n url: user.url,\n role: \"\",\n });\n }\n\n return maintainers;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, version?: string) => {\n const base = `https://crates.io/crates/${name}`;\n return version ? `${base}/${version}` : base;\n },\n download: (name: string, version: string) => {\n return `https://crates.io/api/v1/crates/${name}/${version}/download`;\n },\n documentation: (name: string, version?: string) => {\n return version ? `https://docs.rs/${name}/${version}` : `https://docs.rs/${name}`;\n },\n readme: (name: string, version?: string) => {\n return version\n ? `https://crates.io/api/v1/crates/${name}/${version}/readme`\n : `https://crates.io/crates/${name}`;\n },\n purl: (name: string, version?: string) => {\n return buildPURL({ type: \"cargo\", name, version });\n },\n };\n }\n}\n\nregister(\"cargo\", \"https://crates.io\", CargoRegistry);\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { normalizeLicense } from \"../core/license.ts\";\nimport { normalizeRepositoryURL } from \"../core/repository.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\nimport { rethrowFetchError } from \"./error.ts\";\n\nconst PYPI_FILENAME_SEPARATORS = [\"_\", \"-\", \".\"] as const;\n\n/** PyPI JSON API response for a package. */\ninterface PyPIPackageResponse {\n info: {\n name: string;\n version: string;\n summary: string;\n description: string;\n license: string | null;\n license_expression?: string | null;\n keywords: string;\n author: string | null;\n author_email: string | null;\n maintainer?: string | null;\n maintainer_email?: string | null;\n project_urls: Record<string, string>;\n requires_dist: string[] | null;\n };\n urls: PyPIFile[];\n}\n\n/** PyPI file information. */\ninterface PyPIFile {\n filename: string;\n url: string;\n upload_time_iso_8601: string;\n yanked: boolean;\n digests: {\n sha256: string;\n };\n}\n\n/** PyPI Simple API (PEP 691) response for a project. */\ninterface PyPISimpleResponse {\n meta: { \"api-version\": string };\n name: string;\n versions: string[];\n files: PyPISimpleFile[];\n}\n\n/** A single file entry in the Simple API response. */\ninterface PyPISimpleFile {\n readonly filename: string;\n readonly url: string;\n readonly hashes: Readonly<{ sha256?: string }>;\n readonly \"requires-python\"?: string;\n readonly yanked?: string | false;\n readonly \"upload-time\"?: string;\n}\n\n/**\n * PEP 639 projects put the SPDX expression in `license_expression` and leave `license` null.\n *\n * @param info - License fields of the JSON API `info` object.\n * @returns {string} The normalized SPDX expression, or an empty string.\n */\nfunction pypiLicense(\n info: Readonly<Pick<PyPIPackageResponse[\"info\"], \"license\" | \"license_expression\">>,\n): string {\n return normalizeLicense(info.license_expression || info.license);\n}\n\ninterface PyPIContact {\n readonly name: string;\n readonly email: string;\n}\n\nconst QUOTED_NAME_PATTERN = /^\"((?:[^\"\\\\]|\\\\.)*)\"\\s*<([^>]*)>$/;\nconst ANGLE_ADDRESS_PATTERN = /^([^<]*?)\\s*<([^>]*)>$/;\nconst COMMENT_PATTERN = /\\(([^)]*)\\)/g;\nconst ADDRESS_ITEM_PATTERN = /(?:\"(?:[^\"\\\\]|\\\\.)*\"|<[^>]*>|\\([^)]*\\)|[^,])+/g;\n\n/**\n * Split an address list on the commas outside quotes, angle brackets and one level of comments.\n *\n * @param value - Comma separated mailboxes.\n * @returns {string[]} The trimmed, non-empty items.\n */\nfunction splitAddressList(value: string): string[] {\n return [...value.matchAll(ADDRESS_ITEM_PATTERN)].map(([item]) => item.trim()).filter(Boolean);\n}\n\n/**\n * Read one mailbox; a comment names a bare address, and a bare name has no address.\n *\n * @param item - One item of an address list.\n * @returns {PyPIContact} The name and email found in it.\n */\nfunction parseMailbox(item: string): PyPIContact {\n const quoted = item.match(QUOTED_NAME_PATTERN);\n if (quoted) {\n return { name: quoted[1]!.replaceAll(/\\\\(.)/g, \"$1\").trim(), email: quoted[2]!.trim() };\n }\n\n const comments: string[] = [];\n const bare = item\n .replaceAll(COMMENT_PATTERN, (_match: string, comment: string) => {\n comments.push(comment.trim());\n return \" \";\n })\n .trim();\n const comment = comments.filter(Boolean).join(\" \");\n const angled = bare.match(ANGLE_ADDRESS_PATTERN);\n if (angled) return { name: angled[1]!.trim() || comment, email: angled[2]!.trim() };\n return bare.includes(\"@\") ? { name: comment, email: bare } : { name: bare || comment, email: \"\" };\n}\n\n/**\n * PEP 621 keeps people without an email in the name field, so the label stays its own entry.\n *\n * @param name - The `author` or `maintainer` field.\n * @param emails - The matching `author_email` or `maintainer_email` field.\n * @returns {PyPIContact[]} One contact per person.\n */\nfunction pypiContacts(\n name: string | null | undefined,\n emails: string | null | undefined,\n): PyPIContact[] {\n const label = name?.trim() ?? \"\";\n const contacts = splitAddressList(emails ?? \"\").map(parseMailbox);\n\n if (!label) return contacts;\n if (contacts.length === 1 && !contacts[0]!.name) {\n return [{ name: label, email: contacts[0]!.email }];\n }\n if (contacts.some((contact) => contact.name.toLowerCase() === label.toLowerCase())) {\n return contacts;\n }\n return [{ name: label, email: \"\" }, ...contacts];\n}\n\n/** PyPI registry client. */\nexport class PyPIRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n private readonly downloadUrls = new Map<string, string>();\n\n ecosystem(): string {\n return \"pypi\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const normalized = this.normalizeName(name);\n const url = `${this.baseURL}/pypi/${normalized}/json`;\n\n try {\n const data = await this.client.getJSON<PyPIPackageResponse>(url, signal);\n const info = data.info;\n\n const licenses = pypiLicense(info);\n const repository = this.extractRepository(info.project_urls);\n const keywords = this.parseKeywords(info.keywords);\n\n return {\n name: info.name,\n description: info.summary || info.description || \"\",\n homepage: this.findProjectUrl(info.project_urls, [\"Homepage\"]),\n documentation: this.findProjectUrl(info.project_urls, [\"Documentation\"]),\n repository,\n licenses,\n keywords,\n namespace: \"\",\n latestVersion: info.version,\n metadata: {},\n };\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const normalized = this.normalizeName(name);\n const url = `${this.baseURL}/simple/${normalized}/`;\n\n try {\n const data = await this.client.getJSON<PyPISimpleResponse>(url, signal, {\n Accept: \"application/vnd.pypi.simple.v1+json\",\n });\n\n const filesByVersion = this.indexFilesByVersion(normalized, data.versions, data.files);\n return [...filesByVersion].map(([version, files]) =>\n this.toVersion(normalized, version, files),\n );\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const normalized = this.normalizeName(name);\n const url = `${this.baseURL}/pypi/${normalized}/${version}/json`;\n\n try {\n const data = await this.client.getJSON<PyPIPackageResponse>(url, signal);\n const dependencies: Dependency[] = [];\n\n if (data.info.requires_dist) {\n for (const depStr of data.info.requires_dist) {\n const dep = this.parsePEP508(depStr);\n if (dep) {\n dependencies.push(dep);\n }\n }\n }\n\n return dependencies;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name, version);\n }\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const normalized = this.normalizeName(name);\n const url = `${this.baseURL}/pypi/${normalized}/json`;\n\n try {\n const { info } = await this.client.getJSON<PyPIPackageResponse>(url, signal);\n const groups = [\n [\"author\", pypiContacts(info.author, info.author_email)],\n [\"maintainer\", pypiContacts(info.maintainer, info.maintainer_email)],\n ] as const;\n const seen = new Set<string>();\n const maintainers: Maintainer[] = [];\n\n for (const [role, contacts] of groups) {\n for (const contact of contacts) {\n const key = (contact.email || contact.name).toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n maintainers.push({\n uuid: \"\",\n login: contact.email ? contact.email.split(\"@\")[0]! : \"\",\n name: contact.name,\n email: contact.email,\n url: \"\",\n role,\n });\n }\n }\n\n return maintainers;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, version?: string) => {\n const normalized = this.normalizeName(name);\n const base = `https://pypi.org/project/${normalized}`;\n return version ? `${base}/${version}` : base;\n },\n download: (name: string, version: string) => {\n const normalized = this.normalizeName(name);\n return (\n this.downloadUrls.get(`${normalized}@${version}`) ??\n `https://pypi.org/project/${normalized}/${version}/`\n );\n },\n documentation: (name: string, _version?: string) => {\n const normalized = this.normalizeName(name);\n return `https://pypi.org/project/${normalized}`;\n },\n readme: (name: string, version?: string) => {\n const normalized = this.normalizeName(name);\n return version\n ? `https://pypi.org/project/${normalized}/${version}/`\n : `https://pypi.org/project/${normalized}/`;\n },\n purl: (name: string, version?: string) => {\n return buildPURL({ type: \"pypi\", name: this.normalizeName(name), version });\n },\n };\n }\n\n private indexFilesByVersion(\n normalizedName: string,\n versions: readonly string[],\n files: readonly PyPISimpleFile[],\n ): Map<string, PyPISimpleFile[]> {\n const filesByVersion = new Map<string, PyPISimpleFile[]>();\n\n for (const version of versions) filesByVersion.set(version, []);\n for (const file of files) {\n const version = this.matchFileVersion(file.filename, normalizedName, versions);\n if (version) filesByVersion.get(version)!.push(file);\n }\n\n return filesByVersion;\n }\n\n private toVersion(\n normalizedName: string,\n version: string,\n files: readonly PyPISimpleFile[],\n ): Version {\n if (files.length === 0) {\n return {\n number: version,\n publishedAt: null,\n licenses: \"\",\n integrity: \"\",\n status: \"\",\n metadata: {},\n };\n }\n\n const sdist = files.find((file) => file.filename.endsWith(\".tar.gz\"));\n const file = sdist ?? files[0]!;\n const publishedAt = file[\"upload-time\"] ? new Date(file[\"upload-time\"]) : null;\n const integrity = file.hashes?.sha256 ? `sha256-${file.hashes.sha256}` : \"\";\n const status = file.yanked ? \"yanked\" : \"\";\n\n this.downloadUrls.set(`${normalizedName}@${version}`, file.url);\n\n return {\n number: version,\n publishedAt,\n licenses: \"\",\n integrity,\n status,\n metadata: {},\n };\n }\n\n private matchFileVersion(\n filename: string,\n normalizedName: string,\n versions: readonly string[],\n ): string | undefined {\n const lower = filename.toLowerCase();\n let prefix: string | undefined;\n\n for (const separator of PYPI_FILENAME_SEPARATORS) {\n const candidate = normalizedName.replaceAll(\"-\", separator) + \"-\";\n if (lower.startsWith(candidate)) {\n prefix = candidate;\n break;\n }\n }\n\n if (!prefix) return undefined;\n\n const afterPrefix = filename.slice(prefix.length);\n\n // Wheel: {name}-{version}-{python}-{abi}-{platform}.whl\n // Version is before the first dash after the prefix\n const dashIdx = afterPrefix.indexOf(\"-\");\n if (dashIdx !== -1) {\n const candidate = afterPrefix.slice(0, dashIdx);\n if (versions.includes(candidate)) return candidate;\n }\n\n // Sdist: {name}-{version}.tar.gz / .zip / .tar.bz2\n const stripped = afterPrefix.replace(/\\.(tar\\.(gz|bz2|xz)|zip)$/i, \"\");\n if (versions.includes(stripped)) return stripped;\n\n return undefined;\n }\n\n private normalizeName(name: string): string {\n return name.toLowerCase().replaceAll(/[-_.]+/g, \"-\");\n }\n\n private extractRepository(projectUrls: Readonly<Record<string, string>> | undefined): string {\n const url = this.findProjectUrl(projectUrls, [\n \"Repository\",\n \"Source\",\n \"Source Code\",\n \"GitHub\",\n \"Homepage\",\n ]);\n return normalizeRepositoryURL(url);\n }\n\n private findProjectUrl(\n projectUrls: Readonly<Record<string, string>> | undefined,\n keys: readonly string[],\n ): string {\n if (!projectUrls) return \"\";\n\n const lowered = new Map<string, string>();\n for (const [k, v] of Object.entries(projectUrls)) {\n lowered.set(k.toLowerCase(), v);\n }\n\n for (const key of keys) {\n const value = lowered.get(key.toLowerCase());\n if (value) return value;\n }\n\n return \"\";\n }\n\n private parseKeywords(keywords: string | undefined): string[] {\n if (!keywords) return [];\n return keywords\n .split(\",\")\n .map((k) => k.trim())\n .filter(Boolean);\n }\n\n private parseExtraMarker(marker: string): Pick<Dependency, \"optional\" | \"scope\"> {\n const extraMatch = marker.match(/extra\\s*==\\s*[\"']([^\"']+)[\"']/);\n if (!extraMatch) return { scope: \"runtime\", optional: false };\n\n const extraName = extraMatch[1]!.toLowerCase();\n if (/^dev(elop(ment)?)?$/.test(extraName)) {\n return { scope: \"development\", optional: true };\n }\n if (/^test(s|ing)?$/.test(extraName)) {\n return { scope: \"test\", optional: true };\n }\n return { scope: \"runtime\", optional: true };\n }\n\n private parsePEP508(depStr: string): Dependency | null {\n // PEP 508 format: name [extras] (version_spec) ; markers\n const semiIdx = depStr.indexOf(\";\");\n const mainPart = semiIdx === -1 ? depStr.trim() : depStr.slice(0, semiIdx).trim();\n const markerStr = semiIdx === -1 ? \"\" : depStr.slice(semiIdx + 1).trim();\n\n // Extract name, skip [extras] bracket group, capture version spec\n const match = mainPart.match(/^([a-zA-Z0-9._-]+)\\s*(?:\\[.*?\\])?\\s*(.*)$/);\n if (!match) return null;\n\n const depName = match[1]!;\n let versionSpec = match[2]!.trim();\n\n // Strip surrounding parentheses: \"(<4,>=2)\" -> \"<4,>=2\"\n if (versionSpec.startsWith(\"(\") && versionSpec.endsWith(\")\")) {\n versionSpec = versionSpec.slice(1, -1).trim();\n }\n\n const marker = this.parseExtraMarker(markerStr);\n\n return {\n name: this.normalizeName(depName),\n requirements: versionSpec,\n scope: marker.scope,\n optional: marker.optional,\n };\n }\n}\n\nregister(\"pypi\", \"https://pypi.org\", PyPIRegistry);\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { combineLicenses, normalizeLicense } from \"../core/license.ts\";\nimport { normalizeRepositoryURL } from \"../core/repository.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\nimport { rethrowFetchError } from \"./error.ts\";\n\n/** RubyGems API response for a single gem. */\ninterface RubyGemsGemResponse {\n name: string;\n version?: string;\n description: string;\n homepage_uri?: string;\n documentation_uri?: string;\n source_code_uri?: string;\n licenses?: string[];\n metadata?: Record<string, unknown>;\n dependencies?: {\n runtime?: Array<{\n name: string;\n requirements: string;\n }>;\n development?: Array<{\n name: string;\n requirements: string;\n }>;\n };\n}\n\n/** RubyGems version data. */\ninterface RubyGemsVersionResponse {\n number: string;\n sha: string;\n created_at?: string;\n yanked?: boolean;\n}\n\n/** RubyGems owner data. */\ninterface RubyGemsOwnerResponse {\n handle: string;\n email?: string;\n}\n\nfunction orEmpty(value: string | undefined): string {\n return value || \"\";\n}\n\nfunction gemLicenses(licenses: readonly string[] | undefined): string {\n return licenses ? combineLicenses(licenses.map((license) => normalizeLicense(license))) : \"\";\n}\n\nfunction gemRepositoryURL(\n sourceCodeURI: string | undefined,\n metadata: Readonly<Record<string, unknown>> | undefined,\n homepageURI: string | undefined,\n): string {\n const metadataURI = metadata?.[\"source_code_uri\"];\n if (sourceCodeURI) return normalizeRepositoryURL(sourceCodeURI);\n if (metadataURI) return normalizeRepositoryURL(metadataURI);\n return normalizeRepositoryURL(homepageURI ?? \"\");\n}\n\n/** RubyGems registry client. */\nexport class RubyGemsRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n ecosystem(): string {\n return \"gem\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const url = `${this.baseURL}/api/v1/gems/${name}.json`;\n\n try {\n const data = await this.client.getJSON<RubyGemsGemResponse>(url, signal);\n\n const licenses = gemLicenses(data.licenses);\n const repository = gemRepositoryURL(data.source_code_uri, data.metadata, data.homepage_uri);\n\n return {\n name: data.name,\n description: orEmpty(data.description),\n homepage: orEmpty(data.homepage_uri),\n documentation: orEmpty(data.documentation_uri),\n repository,\n licenses,\n keywords: [],\n namespace: \"\",\n latestVersion: orEmpty(data.version),\n metadata: data.metadata ?? {},\n };\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const url = `${this.baseURL}/api/v1/versions/${name}.json`;\n\n try {\n const data = await this.client.getJSON<RubyGemsVersionResponse[]>(url, signal);\n const versions: Version[] = [];\n\n for (const versionData of data) {\n const publishedAt = versionData.created_at ? new Date(versionData.created_at) : null;\n const status = versionData.yanked ? \"yanked\" : \"\";\n\n versions.push({\n number: versionData.number,\n publishedAt,\n licenses: \"\",\n integrity: versionData.sha ? `sha256-${versionData.sha}` : \"\",\n status,\n metadata: {},\n });\n }\n\n return versions;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const url = `${this.baseURL}/api/v2/rubygems/${name}/versions/${version}.json`;\n\n try {\n const data = await this.client.getJSON<RubyGemsGemResponse>(url, signal);\n const dependencies: Dependency[] = [];\n\n // Runtime dependencies\n if (data.dependencies?.runtime) {\n for (const dep of data.dependencies.runtime) {\n dependencies.push({\n name: dep.name,\n requirements: dep.requirements,\n scope: \"runtime\",\n optional: false,\n });\n }\n }\n\n // Development dependencies\n if (data.dependencies?.development) {\n for (const dep of data.dependencies.development) {\n dependencies.push({\n name: dep.name,\n requirements: dep.requirements,\n scope: \"development\",\n optional: false,\n });\n }\n }\n\n return dependencies;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name, version);\n }\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const url = `${this.baseURL}/api/v1/gems/${name}/owners.json`;\n\n try {\n const data = await this.client.getJSON<RubyGemsOwnerResponse[]>(url, signal);\n const maintainers: Maintainer[] = [];\n\n for (const owner of data) {\n maintainers.push({\n uuid: \"\",\n login: owner.handle,\n name: owner.handle,\n email: owner.email || \"\",\n url: \"\",\n role: \"\",\n });\n }\n\n return maintainers;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, version?: string) => {\n const base = `https://rubygems.org/gems/${name}`;\n return version ? `${base}/versions/${version}` : base;\n },\n download: (name: string, version: string) => {\n return `https://rubygems.org/downloads/${name}-${version}.gem`;\n },\n documentation: (name: string, version?: string) => {\n const versionSuffix = version ? `/${version}` : \"\";\n return `https://www.rubydoc.info/gems/${name}${versionSuffix}`;\n },\n readme: (name: string, version?: string) => {\n const base = `https://rubygems.org/gems/${name}`;\n return version ? `${base}/versions/${version}` : base;\n },\n purl: (name: string, version?: string) => {\n return buildPURL({ type: \"gem\", name, version });\n },\n };\n }\n}\n\nregister(\"gem\", \"https://rubygems.org\", RubyGemsRegistry);\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { NotFoundError, InvalidPURLError } from \"../core/errors.ts\";\nimport { combineLicenses } from \"../core/license.ts\";\nimport { normalizeRepositoryURL } from \"../core/repository.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\nimport { rethrowFetchError } from \"./error.ts\";\n\n/** Packagist API response for a single package. */\ninterface PackagistPackageResponse {\n package: {\n name: string;\n description: string;\n repository?: string;\n keywords?: string[];\n versions: Record<string, PackagistVersion>;\n };\n}\n\ninterface PackagistAuthor {\n readonly name?: string;\n readonly email?: string;\n readonly homepage?: string;\n readonly role?: string;\n}\n\n/** Packagist version data. */\ninterface PackagistVersion {\n name: string;\n version: string;\n license?: string | string[];\n keywords?: string[];\n authors?: readonly PackagistAuthor[];\n require?: Record<string, string>;\n \"require-dev\"?: Record<string, string>;\n source?: {\n type?: string;\n url?: string;\n reference?: string;\n };\n dist?: {\n type?: string;\n url?: string;\n reference?: string;\n shasum?: string;\n };\n time?: string;\n}\n\n/** Packagist registry client. */\nexport class PackagistRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n ecosystem(): string {\n return \"composer\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const [vendor, pkg] = this.parseName(name);\n const url = `${this.baseURL}/packages/${vendor}/${pkg}.json`;\n\n try {\n const data = await this.client.getJSON<PackagistPackageResponse>(url, signal);\n const packageData = data.package;\n\n // Find latest version\n const versions = Object.keys(packageData.versions);\n const latestVersion = this.findLatestVersion(versions);\n\n // Get license from latest version\n const latestVersionData = packageData.versions[latestVersion];\n const licenses = this.extractLicenses(latestVersionData.license);\n\n return {\n name: packageData.name,\n description: packageData.description || \"\",\n homepage: \"\",\n documentation: \"\",\n repository: normalizeRepositoryURL(\n packageData.repository ? packageData.repository : (latestVersionData.source?.url ?? \"\"),\n ),\n licenses,\n keywords: packageData.keywords ?? [],\n namespace: vendor,\n latestVersion,\n metadata: {},\n };\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const [vendor, pkg] = this.parseName(name);\n const url = `${this.baseURL}/packages/${vendor}/${pkg}.json`;\n\n try {\n const data = await this.client.getJSON<PackagistPackageResponse>(url, signal);\n const versions: Version[] = [];\n\n for (const [versionStr, versionData] of Object.entries(data.package.versions)) {\n const licenses = this.extractLicenses(versionData.license);\n const publishedAt = versionData.time ? new Date(versionData.time) : null;\n\n versions.push({\n number: versionStr,\n publishedAt,\n licenses,\n integrity: versionData.dist?.shasum ? `sha1-${versionData.dist.shasum}` : \"\",\n status: \"\",\n metadata: {},\n });\n }\n\n return versions;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const [vendor, pkg] = this.parseName(name);\n const url = `${this.baseURL}/packages/${vendor}/${pkg}.json`;\n\n try {\n const data = await this.client.getJSON<PackagistPackageResponse>(url, signal);\n const versionData = data.package.versions[version];\n\n if (!versionData) {\n throw new NotFoundError(\"composer\", name, version);\n }\n\n const dependencies: Dependency[] = [];\n\n // Runtime dependencies\n if (versionData.require) {\n for (const [depName, requirements] of Object.entries(versionData.require)) {\n if (!this.shouldSkipDependency(depName)) {\n dependencies.push({\n name: depName,\n requirements,\n scope: \"runtime\",\n optional: false,\n });\n }\n }\n }\n\n // Development dependencies\n if (versionData[\"require-dev\"]) {\n for (const [depName, requirements] of Object.entries(versionData[\"require-dev\"])) {\n if (!this.shouldSkipDependency(depName)) {\n dependencies.push({\n name: depName,\n requirements,\n scope: \"development\",\n optional: false,\n });\n }\n }\n }\n\n return dependencies;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name, version);\n }\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const [vendor, pkg] = this.parseName(name);\n const url = `${this.baseURL}/packages/${vendor}/${pkg}.json`;\n\n try {\n const data = await this.client.getJSON<PackagistPackageResponse>(url, signal);\n return this.collectMaintainers(Object.values(data.package.versions));\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, version?: string) => {\n const [vendor, pkg] = this.parseName(name);\n const base = `https://packagist.org/packages/${vendor}/${pkg}`;\n return version ? `${base}#${version}` : base;\n },\n download: (name: string, version: string) => {\n const [vendor, pkg] = this.parseName(name);\n return `https://repo.packagist.org/p/${vendor}/${pkg}/${version}.json`;\n },\n documentation: (name: string, _version?: string) => {\n const [vendor, pkg] = this.parseName(name);\n return `https://packagist.org/packages/${vendor}/${pkg}`;\n },\n readme: (name: string, _version?: string) => {\n const [vendor, pkg] = this.parseName(name);\n return `https://packagist.org/packages/${vendor}/${pkg}`;\n },\n purl: (name: string, version?: string) => {\n const [vendor, pkg] = this.parseName(name);\n return buildPURL({ type: \"composer\", namespace: vendor, name: pkg, version });\n },\n };\n }\n\n private collectMaintainers(\n versions: readonly Readonly<Pick<PackagistVersion, \"authors\">>[],\n ): Maintainer[] {\n const maintainers: Maintainer[] = [];\n const seen = new Set<string>();\n\n for (const version of versions) {\n for (const author of version.authors ?? []) {\n const key = `${author.name}:${author.email}`;\n if (seen.has(key)) continue;\n seen.add(key);\n maintainers.push(this.toMaintainer(author));\n }\n }\n\n return maintainers;\n }\n\n private toMaintainer(author: Readonly<PackagistAuthor>): Maintainer {\n return {\n uuid: \"\",\n login: author.email ? author.email.split(\"@\")[0] : \"\",\n name: author.name || \"\",\n email: author.email || \"\",\n url: author.homepage || \"\",\n role: author.role || \"\",\n };\n }\n\n private parseName(name: string): [string, string] {\n const parts = name.split(\"/\");\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new InvalidPURLError(\n `pkg:composer/${name}`,\n 'invalid Composer package name, expected \"vendor/package\" format',\n );\n }\n return [parts[0]!, parts[1]!];\n }\n\n private findLatestVersion(versions: readonly string[]): string {\n // Filter out dev versions\n const stable = versions.filter((v) => !v.startsWith(\"dev-\") && !v.endsWith(\"-dev\"));\n if (stable.length === 0) {\n return versions[0] || \"\";\n }\n\n // Sort by semantic versioning (simplified)\n return (\n stable.sort((a, b) => {\n // Remove 'v' prefix if present\n const aClean = a.replace(/^v/, \"\");\n const bClean = b.replace(/^v/, \"\");\n\n // Try numeric comparison for simple versions\n const aParts = aClean.split(\".\").map((p) => Number.parseInt(p, 10));\n const bParts = bClean.split(\".\").map((p) => Number.parseInt(p, 10));\n\n for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n const aPart = aParts[i] ?? 0;\n const bPart = bParts[i] ?? 0;\n if (aPart !== bPart) {\n return bPart - aPart;\n }\n }\n\n return 0;\n })[0] ||\n versions[0] ||\n \"\"\n );\n }\n\n private extractLicenses(raw: string | readonly string[] | undefined): string {\n if (!raw) return \"\";\n\n const licenses = Array.isArray(raw) ? raw : [raw];\n return combineLicenses(licenses);\n }\n\n private shouldSkipDependency(name: string): boolean {\n return name === \"php\" || name.startsWith(\"ext-\");\n }\n}\n\nregister(\"composer\", \"https://packagist.org\", PackagistRegistry);\n","import type { Client } from \"../core/client.ts\";\nimport type { Dependency, Maintainer, Package, URLBuilder, Version } from \"../core/types.ts\";\nimport { Registry, register } from \"../core/registry.ts\";\nimport { NotFoundError } from \"../core/errors.ts\";\nimport { combineLicenses } from \"../core/license.ts\";\nimport { buildPURL } from \"../core/purl.ts\";\nimport { rethrowFetchError } from \"./error.ts\";\n\nconst AUR_BASE_URL = \"https://aur.archlinux.org\";\n\n/** Arch Linux official package search response. */\ninterface ArchSearchResponse {\n results: ArchPackageResult[];\n}\n\n/** Arch Linux official package data from search/detail endpoints. */\ninterface ArchPackageResult {\n pkgname: string;\n pkgbase: string;\n repo: string;\n arch: string;\n pkgver: string;\n pkgrel: string;\n epoch: number;\n pkgdesc: string;\n url: string;\n filename: string;\n compressed_size: number;\n installed_size: number;\n build_date: string;\n last_update: string;\n flag_date: string | null;\n maintainers: string[];\n packager: string;\n groups: string[];\n licenses: string[];\n conflicts: string[];\n provides: string[];\n replaces: string[];\n depends: string[];\n optdepends: string[];\n makedepends: string[];\n checkdepends: string[];\n}\n\n/** AUR RPC v5 response wrapper. */\ninterface AurResponse {\n resultcount: number;\n results: AurPackageResult[];\n type: string;\n version: number;\n}\n\n/** AUR package data. */\ninterface AurPackageResult {\n ID: number;\n Name: string;\n PackageBase: string;\n PackageBaseID: number;\n Version: string;\n Description: string;\n URL: string;\n NumVotes: number;\n Popularity: number;\n OutOfDate: number | null;\n Maintainer: string | null;\n FirstSubmitted: number;\n LastModified: number;\n URLPath: string;\n Depends?: string[];\n OptDepends?: string[];\n MakeDepends?: string[];\n CheckDepends?: string[];\n License?: string[];\n Keywords?: string[];\n}\n\n/** ALPM registry client — routes to Arch Linux official repos or AUR based on namespace. */\nexport class AlpmRegistry extends Registry {\n constructor(baseURL: string, client: Client) {\n super();\n this.baseURL = baseURL;\n this.client = client;\n }\n\n readonly baseURL: string;\n readonly client: Client;\n\n ecosystem(): string {\n return \"alpm\";\n }\n\n async fetchPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const { namespace, pkgName } = this.parseName(name);\n this.assertSupportedNamespace(namespace, name);\n\n if (namespace === \"aur\") {\n return this.fetchAurPackage(pkgName, signal);\n }\n\n return this.fetchOfficialPackage(pkgName, signal);\n }\n\n async fetchVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const { namespace, pkgName } = this.parseName(name);\n this.assertSupportedNamespace(namespace, name);\n\n if (namespace === \"aur\") {\n return this.fetchAurVersions(pkgName, signal);\n }\n\n return this.fetchOfficialVersions(pkgName, signal);\n }\n\n async fetchDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const { namespace, pkgName } = this.parseName(name);\n this.assertSupportedNamespace(namespace, name);\n\n if (namespace === \"aur\") {\n return this.fetchAurDependencies(pkgName, version, signal);\n }\n\n return this.fetchOfficialDependencies(pkgName, version, signal);\n }\n\n async fetchMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const { namespace, pkgName } = this.parseName(name);\n this.assertSupportedNamespace(namespace, name);\n\n if (namespace === \"aur\") {\n return this.fetchAurMaintainers(pkgName, signal);\n }\n\n return this.fetchOfficialMaintainers(pkgName, signal);\n }\n\n urls(): URLBuilder {\n return {\n registry: (name: string, _version?: string) => {\n const { namespace, pkgName } = this.parseName(name);\n if (namespace === \"aur\") {\n return `https://aur.archlinux.org/packages/${pkgName}`;\n }\n return `https://archlinux.org/packages/?name=${pkgName}`;\n },\n download: (name: string, _version: string) => {\n const { namespace, pkgName } = this.parseName(name);\n if (namespace === \"aur\") {\n return `https://aur.archlinux.org/cgit/aur.git/snapshot/${pkgName}.tar.gz`;\n }\n const letter = pkgName.charAt(0);\n return `https://archive.archlinux.org/packages/${letter}/${pkgName}/`;\n },\n documentation: (name: string, _version?: string) => {\n const { namespace, pkgName } = this.parseName(name);\n if (namespace === \"aur\") {\n return `https://aur.archlinux.org/packages/${pkgName}`;\n }\n return `https://wiki.archlinux.org/title/${pkgName}`;\n },\n readme: (_name: string, _version?: string) => {\n return \"\";\n },\n purl: (name: string, version?: string) => {\n const { namespace, pkgName } = this.parseName(name);\n return buildPURL({ type: \"alpm\", namespace, name: pkgName, version });\n },\n };\n }\n\n // --- Official Arch Linux API ---\n\n private async fetchOfficialPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const result = await this.searchOfficial(name, signal);\n\n return {\n name: result.pkgname,\n description: result.pkgdesc || \"\",\n homepage: result.url || \"\",\n documentation: \"\",\n repository: \"\",\n licenses: combineLicenses(result.licenses),\n keywords: result.groups,\n namespace: \"arch\",\n latestVersion: this.formatVersion(result),\n metadata: {\n repo: result.repo,\n arch: result.arch,\n pkgbase: result.pkgbase,\n compressedSize: result.compressed_size,\n installedSize: result.installed_size,\n buildDate: result.build_date,\n lastUpdate: result.last_update,\n flagDate: result.flag_date,\n packager: result.packager,\n provides: result.provides,\n conflicts: result.conflicts,\n replaces: result.replaces,\n },\n };\n }\n\n private async fetchOfficialVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const result = await this.searchOfficial(name, signal);\n\n return [\n {\n number: this.formatVersion(result),\n publishedAt: result.last_update ? new Date(result.last_update) : null,\n licenses: combineLicenses(result.licenses),\n integrity: \"\",\n status: result.flag_date ? \"deprecated\" : \"\",\n metadata: {\n repo: result.repo,\n arch: result.arch,\n },\n },\n ];\n }\n\n private async fetchOfficialDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const result = await this.searchOfficial(name, signal);\n const currentVersion = this.formatVersion(result);\n this.assertVersionMatches(name, version, currentVersion);\n\n return this.buildDependencies(\n result.depends,\n result.makedepends,\n result.optdepends,\n result.checkdepends,\n );\n }\n\n private async fetchOfficialMaintainers(\n name: string,\n signal?: AbortSignal,\n ): Promise<Maintainer[]> {\n const result = await this.searchOfficial(name, signal);\n\n return result.maintainers.map((m) => ({\n uuid: \"\",\n login: m,\n name: m,\n email: \"\",\n url: \"\",\n role: \"maintainer\",\n }));\n }\n\n private async searchOfficial(name: string, signal?: AbortSignal): Promise<ArchPackageResult> {\n const url = `${this.baseURL}/packages/search/json/?name=${encodeURIComponent(name)}`;\n\n try {\n const data = await this.client.getJSON<ArchSearchResponse>(url, signal);\n\n if (!data.results || data.results.length === 0) {\n throw new NotFoundError(\"alpm\", name);\n }\n\n // Prefer x86_64 arch, fall back to first result\n return data.results.find((r) => r.arch === \"x86_64\") ?? data.results[0]!;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), name);\n }\n }\n\n // --- AUR API ---\n\n private async fetchAurPackage(name: string, signal?: AbortSignal): Promise<Package> {\n const result = await this.fetchAurInfo(name, signal);\n\n return {\n name: result.Name,\n description: result.Description || \"\",\n homepage: result.URL || \"\",\n documentation: \"\",\n repository: \"\",\n licenses: combineLicenses(result.License ?? []),\n keywords: result.Keywords ?? [],\n namespace: \"aur\",\n latestVersion: result.Version,\n metadata: {\n votes: result.NumVotes,\n popularity: result.Popularity,\n outOfDate: result.OutOfDate,\n pkgbase: result.PackageBase,\n firstSubmitted: result.FirstSubmitted,\n lastModified: result.LastModified,\n },\n };\n }\n\n private async fetchAurVersions(name: string, signal?: AbortSignal): Promise<Version[]> {\n const result = await this.fetchAurInfo(name, signal);\n\n return [\n {\n number: result.Version,\n publishedAt: result.LastModified ? new Date(result.LastModified * 1000) : null,\n licenses: combineLicenses(result.License ?? []),\n integrity: \"\",\n status: result.OutOfDate ? \"deprecated\" : \"\",\n metadata: {\n votes: result.NumVotes,\n popularity: result.Popularity,\n },\n },\n ];\n }\n\n private async fetchAurDependencies(\n name: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<Dependency[]> {\n const result = await this.fetchAurInfo(name, signal);\n this.assertVersionMatches(`aur/${name}`, version, result.Version);\n\n return this.buildDependencies(\n result.Depends ?? [],\n result.MakeDepends ?? [],\n result.OptDepends ?? [],\n result.CheckDepends ?? [],\n );\n }\n\n private async fetchAurMaintainers(name: string, signal?: AbortSignal): Promise<Maintainer[]> {\n const result = await this.fetchAurInfo(name, signal);\n\n if (!result.Maintainer) return [];\n\n return [\n {\n uuid: \"\",\n login: result.Maintainer,\n name: result.Maintainer,\n email: \"\",\n url: \"\",\n role: \"maintainer\",\n },\n ];\n }\n\n private async fetchAurInfo(name: string, signal?: AbortSignal): Promise<AurPackageResult> {\n const url = `${AUR_BASE_URL}/rpc/v5/info/${encodeURIComponent(name)}`;\n\n try {\n const data = await this.client.getJSON<AurResponse>(url, signal);\n\n if (!data.results || data.results.length === 0) {\n throw new NotFoundError(\"alpm\", `aur/${name}`);\n }\n\n return data.results[0]!;\n } catch (error) {\n rethrowFetchError(error, this.ecosystem(), `aur/${name}`);\n }\n }\n\n // --- Shared helpers ---\n\n private parseName(fullName: string): { namespace: string; pkgName: string } {\n const normalized = fullName.trim().toLowerCase();\n const slashIdx = normalized.indexOf(\"/\");\n if (slashIdx === -1) {\n return { namespace: \"arch\", pkgName: normalized };\n }\n return {\n namespace: normalized.slice(0, slashIdx),\n pkgName: normalized.slice(slashIdx + 1),\n };\n }\n\n private assertSupportedNamespace(namespace: string, requestedName: string): void {\n if (namespace !== \"arch\" && namespace !== \"aur\") {\n throw new NotFoundError(\"alpm\", requestedName);\n }\n }\n\n private assertVersionMatches(name: string, requested: string, current: string): void {\n if (requested && requested !== current) {\n throw new NotFoundError(\"alpm\", name, requested);\n }\n }\n\n private formatVersion(\n result: Readonly<Pick<ArchPackageResult, \"epoch\" | \"pkgrel\" | \"pkgver\">>,\n ): string {\n const epoch = result.epoch && result.epoch > 0 ? `${result.epoch}:` : \"\";\n return `${epoch}${result.pkgver}-${result.pkgrel}`;\n }\n\n private buildDependencies(\n depends: readonly string[],\n makedepends: readonly string[],\n optdepends: readonly string[],\n checkdepends: readonly string[],\n ): Dependency[] {\n const dependencies: Dependency[] = [];\n\n for (const dep of depends) {\n const parsed = this.parseDep(dep);\n dependencies.push({\n name: parsed.name,\n requirements: parsed.requirements,\n scope: \"runtime\",\n optional: false,\n });\n }\n\n for (const dep of makedepends) {\n const parsed = this.parseDep(dep);\n dependencies.push({\n name: parsed.name,\n requirements: parsed.requirements,\n scope: \"build\",\n optional: false,\n });\n }\n\n for (const dep of optdepends) {\n const parsed = this.parseOptDep(dep);\n dependencies.push({\n name: parsed.name,\n requirements: parsed.requirements,\n scope: \"optional\",\n optional: true,\n });\n }\n\n for (const dep of checkdepends) {\n const parsed = this.parseDep(dep);\n dependencies.push({\n name: parsed.name,\n requirements: parsed.requirements,\n scope: \"test\",\n optional: false,\n });\n }\n\n return dependencies;\n }\n\n private parseDep(dep: string): { name: string; requirements: string } {\n const match = dep.match(/^([a-zA-Z0-9@._+-]+)(.*)$/);\n if (!match) return { name: dep, requirements: \"\" };\n return {\n name: match[1]!,\n requirements: match[2]!.trim(),\n };\n }\n\n private parseOptDep(dep: string): { name: string; requirements: string; description: string } {\n const colonIdx = dep.indexOf(\":\");\n if (colonIdx === -1) {\n const parsed = this.parseDep(dep.trim());\n return { name: parsed.name, requirements: parsed.requirements, description: \"\" };\n }\n const parsed = this.parseDep(dep.slice(0, colonIdx).trim());\n\n return {\n name: parsed.name,\n requirements: parsed.requirements,\n description: dep.slice(colonIdx + 1).trim(),\n };\n }\n}\n\nregister(\"alpm\", \"https://archlinux.org\", AlpmRegistry);\n"],"mappings":"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"}
|