From 479957c0734036904fdea247af758a596aeb11ab Mon Sep 17 00:00:00 2001 From: Florian Imdahl Date: Sat, 4 Sep 2021 10:13:23 +0200 Subject: [PATCH 1/4] feat: Add package info to some responses --- src/RepositoryParser.ts | 21 ++++++++++++--------- src/routes/packagesRoute.ts | 4 +++- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/RepositoryParser.ts b/src/RepositoryParser.ts index a91b533f..ba628d1c 100644 --- a/src/RepositoryParser.ts +++ b/src/RepositoryParser.ts @@ -17,13 +17,15 @@ export enum ParseStatus { } export type ParseResult = - | { - status: Exclude; - } - | { - status: ParseStatus.SUCCESS; - url: string; - }; + | {packageInfo?: packageJson.FullMetadata} & ( + | { + status: Exclude; + } + | { + status: ParseStatus.SUCCESS; + url: string; + } + ); export class RepositoryParser { public static async getPackageUrl(rawPackageName: string, version: string = 'latest'): Promise { @@ -73,7 +75,7 @@ export class RepositoryParser { if (!parsedUrl) { logger.info(`No source URL found in package "${rawPackageName}".`); - return {status: ParseStatus.NO_URL_FOUND}; + return {packageInfo, status: ParseStatus.NO_URL_FOUND}; } parsedUrl = parsedUrl.toString().trim().toLowerCase(); @@ -82,12 +84,13 @@ export class RepositoryParser { if (!urlIsValid) { logger.info(`Invalid URL "${parsedUrl}" for package "${rawPackageName}".`); - return {status: ParseStatus.INVALID_URL}; + return {packageInfo, status: ParseStatus.INVALID_URL}; } parsedUrl = RepositoryParser.tryHTTPS(parsedUrl); return { + packageInfo, status: ParseStatus.SUCCESS, url: parsedUrl, }; diff --git a/src/routes/packagesRoute.ts b/src/routes/packagesRoute.ts index ed7d9607..bf27386d 100644 --- a/src/routes/packagesRoute.ts +++ b/src/routes/packagesRoute.ts @@ -40,6 +40,7 @@ export function packagesRoute(): Router { logger.info(`Returning raw info for "${packageName}": "${redirectSite}" ...`); return res.json({ code: HTTP_STATUS.OK, + packageInfo: parseResult.packageInfo, url: redirectSite, }); } @@ -57,7 +58,8 @@ export function packagesRoute(): Router { case ParseStatus.NO_URL_FOUND: { return res.status(HTTP_STATUS.NOT_FOUND).json({ code: HTTP_STATUS.NOT_FOUND, - message: `No source URL found. Please visit https://www.npmjs.com/package/${packageName}.`, + message: 'No source URL found', + packageInfo: parseResult.packageInfo, }); } case ParseStatus.PACKAGE_NOT_FOUND: { From dbafb7c97cd6ea6d4a4b0ae0a2017410a1539258 Mon Sep 17 00:00:00 2001 From: Florian Imdahl Date: Wed, 16 Mar 2022 20:23:28 +0100 Subject: [PATCH 2/4] fix: send info only for some errors --- src/routes/packagesRoute.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/routes/packagesRoute.ts b/src/routes/packagesRoute.ts index 5903a742..8571660b 100644 --- a/src/routes/packagesRoute.ts +++ b/src/routes/packagesRoute.ts @@ -55,7 +55,7 @@ export function packagesRoute(): Router { } const parseResult = await getPackageUrl(packageName, version); - let packageInfo: packageJson.FullMetadata | undefined; + const packageInfo = parseResult.packageInfo; switch (parseResult.status) { case ParseStatus.SUCCESS: { @@ -65,7 +65,7 @@ export function packagesRoute(): Router { logger.info(`Returning raw info for "${packageName}": "${redirectSite}" ...`); return response.json({ code: HTTP_STATUS.OK, - packageInfo: parseResult.packageInfo, + packageInfo: packageInfo, url: redirectSite, }); } @@ -83,9 +83,8 @@ export function packagesRoute(): Router { case ParseStatus.INVALID_URL: case ParseStatus.NO_URL_FOUND: { errorCode = HTTP_STATUS.NOT_FOUND; - packageInfo = parseResult.packageInfo; errorMessage = `No source URL found.`; - break; + return response.status(errorCode).json({code: errorCode, message: errorMessage, packageInfo}); } case ParseStatus.PACKAGE_NOT_FOUND: { @@ -108,7 +107,7 @@ export function packagesRoute(): Router { } } - return response.status(errorCode).json({code: errorCode, message: errorMessage, packageInfo}); + return response.status(errorCode).json({code: errorCode, message: errorMessage}); } ); } From 25e57c581a756a13cef1c07f3fe074333a0bda9a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 13 May 2026 10:28:38 +0000 Subject: [PATCH 3/4] docs(swagger): document packageInfo in 404 package responses Agent-Logs-Url: https://github.com/ffflorian/pkgsource/sessions/11583112-5ede-4b9c-b043-9d61c1da3e76 Co-authored-by: ffflorian <5497598+ffflorian@users.noreply.github.com> --- swagger.json | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/swagger.json b/swagger.json index 31e53108..80f69eb4 100644 --- a/swagger.json +++ b/swagger.json @@ -8,9 +8,13 @@ }, "message": { "type": "string" + }, + "packageInfo": { + "additionalProperties": true, + "type": "object" } }, - "required": ["code", "url"], + "required": ["code", "message"], "type": "object" }, "RawQuery": { @@ -215,14 +219,18 @@ { "example": { "code": 404, - "url": "Package not found" + "message": "No source URL found. Please visit https://www.npmjs.com/package/pkgsource.", + "packageInfo": { + "name": "pkgsource", + "version": "1.8.0" + } } } ] } } }, - "description": "Version or package not found" + "description": "Version, package, or source URL not found" }, "422": { "content": { @@ -235,7 +243,7 @@ { "example": { "code": 422, - "url": "Invalid package name" + "message": "Invalid package name" } } ] @@ -255,7 +263,7 @@ { "example": { "code": 500, - "url": "Internal server error" + "message": "Internal server error" } } ] From 7e3ad0008929a000055e4b08e32788be6fe120f4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 13 May 2026 10:29:18 +0000 Subject: [PATCH 4/4] docs(swagger): describe packageInfo field semantics Agent-Logs-Url: https://github.com/ffflorian/pkgsource/sessions/11583112-5ede-4b9c-b043-9d61c1da3e76 Co-authored-by: ffflorian <5497598+ffflorian@users.noreply.github.com> --- swagger.json | 1 + 1 file changed, 1 insertion(+) diff --git a/swagger.json b/swagger.json index 80f69eb4..ffbecbfe 100644 --- a/swagger.json +++ b/swagger.json @@ -11,6 +11,7 @@ }, "packageInfo": { "additionalProperties": true, + "description": "Metadata from npm for the requested package/version (for example name and version). Returned when no valid source URL can be resolved.", "type": "object" } },