Skip to content

Commit 2d20f97

Browse files
ieedancursoragent
andauthored
Fix manifest fetch 400 error (#686)
Co-authored-by: aidanbleser35 <aidanbleser35@gmail.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com>
1 parent a3cd8e4 commit 2d20f97

File tree

11 files changed

+86
-4
lines changed

11 files changed

+86
-4
lines changed

.changeset/fix-error-stacking.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"jsrepo": patch
3+
---
4+
5+
Fix error message stacking in manifest fetch errors. Removes redundant "Error fetching" prefixes to improve readability of error messages.

packages/jsrepo/src/providers/azure.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ class Azure implements Provider {
7878
const response = await f(url.toString(), { headers });
7979

8080
if (!response.ok) {
81+
const isJson = response.headers.get('content-type')?.includes('application/json');
82+
if (isJson) {
83+
throw new ProviderFetchError(
84+
`${response.status} ${(await response.json()).message ?? response.statusText}`,
85+
url.toString()
86+
);
87+
}
8188
throw new ProviderFetchError(
8289
`${response.status} ${response.statusText}`,
8390
url.toString()
@@ -86,6 +93,9 @@ class Azure implements Provider {
8693

8794
return await response.text();
8895
} catch (error) {
96+
if (error instanceof ProviderFetchError) {
97+
throw new ProviderFetchError(error.originalMessage, url.toString());
98+
}
8999
throw new ProviderFetchError(
90100
`${error instanceof Error ? error.message : String(error)}`,
91101
url.toString()

packages/jsrepo/src/providers/bitbucket.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ class BitBucket implements Provider {
7979
const response = await f(url.toString(), { headers });
8080

8181
if (!response.ok) {
82+
const isJson = response.headers.get('content-type')?.includes('application/json');
83+
if (isJson) {
84+
throw new ProviderFetchError(
85+
`${response.status} ${(await response.json()).message ?? response.statusText}`,
86+
url.toString()
87+
);
88+
}
8289
throw new ProviderFetchError(
8390
`${response.status} ${response.statusText}`,
8491
url.toString()
@@ -87,6 +94,9 @@ class BitBucket implements Provider {
8794

8895
return await response.text();
8996
} catch (error) {
97+
if (error instanceof ProviderFetchError) {
98+
throw new ProviderFetchError(error.originalMessage, url.toString());
99+
}
90100
throw new ProviderFetchError(
91101
`${error instanceof Error ? error.message : String(error)}`,
92102
url.toString()

packages/jsrepo/src/providers/fs.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ class Fs implements Provider {
6161
const resourcePathStr = path.isAbsolute(filePath)
6262
? filePath
6363
: path.join(process.cwd(), filePath);
64+
if (error instanceof ProviderFetchError) {
65+
throw new ProviderFetchError(error.originalMessage, resourcePathStr);
66+
}
6467
throw new ProviderFetchError(
6568
`${error instanceof Error ? error.message : String(error)}`,
6669
resourcePathStr

packages/jsrepo/src/providers/github.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ class GitHub implements Provider {
8080
const response = await f(url.toString(), { headers });
8181

8282
if (!response.ok) {
83+
const isJson = response.headers.get('content-type')?.includes('application/json');
84+
if (isJson) {
85+
throw new ProviderFetchError(
86+
`${response.status} ${(await response.json()).message ?? response.statusText}`,
87+
url.toString()
88+
);
89+
}
8390
throw new ProviderFetchError(
8491
`${response.status} ${response.statusText}`,
8592
url.toString()
@@ -88,6 +95,9 @@ class GitHub implements Provider {
8895

8996
return await response.text();
9097
} catch (error) {
98+
if (error instanceof ProviderFetchError) {
99+
throw new ProviderFetchError(error.originalMessage, url.toString());
100+
}
91101
throw new ProviderFetchError(
92102
`${error instanceof Error ? error.message : String(error)}`,
93103
url.toString()

packages/jsrepo/src/providers/gitlab.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ class GitLab implements Provider {
8080
const response = await f(url.toString(), { headers });
8181

8282
if (!response.ok) {
83+
const isJson = response.headers.get('content-type')?.includes('application/json');
84+
if (isJson) {
85+
throw new ProviderFetchError(
86+
`${response.status} ${(await response.json()).message ?? response.statusText}`,
87+
url.toString()
88+
);
89+
}
8390
throw new ProviderFetchError(
8491
`${response.status} ${response.statusText}`,
8592
url.toString()
@@ -88,6 +95,9 @@ class GitLab implements Provider {
8895

8996
return await response.text();
9097
} catch (error) {
98+
if (error instanceof ProviderFetchError) {
99+
throw new ProviderFetchError(error.originalMessage, url.toString());
100+
}
91101
throw new ProviderFetchError(
92102
`${error instanceof Error ? error.message : String(error)}`,
93103
url.toString()

packages/jsrepo/src/providers/http.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ class Http implements Provider {
9999
const response = await f(url.toString(), { headers });
100100

101101
if (!response.ok) {
102+
const isJson = response.headers.get('content-type')?.includes('application/json');
103+
if (isJson) {
104+
throw new ProviderFetchError(
105+
`${response.status} ${(await response.json()).message ?? response.statusText}`,
106+
url.toString()
107+
);
108+
}
102109
throw new ProviderFetchError(
103110
`${response.status} ${response.statusText}`,
104111
url.toString()
@@ -107,6 +114,9 @@ class Http implements Provider {
107114

108115
return await response.text();
109116
} catch (error) {
117+
if (error instanceof ProviderFetchError) {
118+
throw new ProviderFetchError(error.originalMessage, url.toString());
119+
}
110120
throw new ProviderFetchError(
111121
`${error instanceof Error ? error.message : String(error)}`,
112122
url.toString()

packages/jsrepo/src/providers/jsrepo.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@ class Jsrepo implements Provider {
108108
const response = await f(url.toString(), { headers });
109109

110110
if (!response.ok) {
111+
const isJson = response.headers.get('content-type')?.includes('application/json');
112+
if (isJson) {
113+
throw new ProviderFetchError(
114+
`${response.status} ${(await response.json()).message ?? response.statusText}`,
115+
url.toString()
116+
);
117+
}
111118
throw new ProviderFetchError(
112119
`${response.status} ${response.statusText}`,
113120
url.toString()
@@ -116,6 +123,9 @@ class Jsrepo implements Provider {
116123

117124
return await response.text();
118125
} catch (error) {
126+
if (error instanceof ProviderFetchError) {
127+
throw new ProviderFetchError(error.originalMessage, url.toString());
128+
}
119129
throw new ProviderFetchError(
120130
`${error instanceof Error ? error.message : String(error)}`,
121131
url.toString()

packages/jsrepo/src/utils/add.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ export async function fetchFile(fileName: string, block: ResolvedItem) {
365365
} catch (error) {
366366
if (error instanceof ProviderFetchError)
367367
return err(
368-
new RegistryFileFetchError(error.message, {
368+
new RegistryFileFetchError(error.originalMessage, {
369369
registry: block.registry.url,
370370
item: block.name,
371371
resourcePath: error.resourcePath,

packages/jsrepo/src/utils/errors.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,20 +98,24 @@ export class RegistryItemNotFoundError extends JsrepoError {
9898

9999
export class ProviderFetchError extends JsrepoError {
100100
readonly resourcePath: string;
101+
readonly originalMessage: string;
101102
constructor(message: string, resourcePath: string) {
102103
super(`Error fetching ${resourcePath}: ${message}`, {
103104
suggestion: 'Please try again.',
104105
});
105106
this.resourcePath = resourcePath;
107+
this.originalMessage = message;
106108
}
107109
}
108110

109111
export class ManifestFetchError extends JsrepoError {
110112
constructor(error: unknown) {
111113
super(
112114
error instanceof ProviderFetchError
113-
? `Error fetching manifest file from ${pc.bold(error.resourcePath)}: ${error.message}`
114-
: `Error fetching manifest file: ${error instanceof Error ? error.message : String(error)}`,
115+
? `Error fetching manifest file from ${pc.bold(error.resourcePath)}: ${error.originalMessage}`
116+
: error instanceof ManifestFetchError
117+
? error.message
118+
: `Error fetching manifest file: ${error instanceof Error ? error.message : String(error)}`,
115119
{
116120
suggestion: 'Please try again.',
117121
}
@@ -125,7 +129,7 @@ export class RegistryItemFetchError extends JsrepoError {
125129
error instanceof ProviderFetchError
126130
? `Error fetching ${pc.bold(`${options.registry}/${options.item}`)} from ${pc.bold(
127131
error.resourcePath
128-
)}: ${error.message}`
132+
)}: ${error.originalMessage}`
129133
: `Error fetching ${options.registry}/${options.item}: ${
130134
error instanceof Error ? error.message : String(error)
131135
}`,

0 commit comments

Comments
 (0)