Skip to content

Commit c4e23fe

Browse files
committed
feat(gitlab): save in lock the http error cause
1 parent f2e3e3b commit c4e23fe

5 files changed

Lines changed: 60 additions & 0 deletions

File tree

packageManager/src/dependency/Dependency.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,38 @@ export abstract class Dependency {
123123
lock.warnings.push({ message });
124124
}
125125

126+
/**
127+
* Extract a concise nested error cause for persistence in lock entries.
128+
*/
129+
protected getErrorCause(error: unknown): string | undefined {
130+
if (!(error instanceof Error)) {
131+
return undefined;
132+
}
133+
134+
const nestedCause = error.cause instanceof Error
135+
? error.cause.message
136+
: typeof error.cause === 'string'
137+
? error.cause
138+
: undefined;
139+
140+
if (nestedCause && nestedCause !== error.message) {
141+
return `${error.message}: ${nestedCause}`;
142+
}
143+
144+
return error.message || undefined;
145+
}
146+
147+
/**
148+
* Persist the underlying error as a second lock entry when it adds detail.
149+
*/
150+
protected addOriginalError(lock: LockEntry, summaryMessage: string, error: unknown): void {
151+
const originalMessage = this.getErrorCause(error);
152+
if (!originalMessage || originalMessage === summaryMessage) {
153+
return;
154+
}
155+
this.addError(lock, originalMessage);
156+
}
157+
126158
/**
127159
* Resolve version/tag to download
128160
*/

packageManager/src/dependency/GithubDependency.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ export class GitHubDependency extends Dependency {
176176
} else {
177177
this.addError(lock, message);
178178
}
179+
this.addOriginalError(lock, message, error);
179180
}
180181

181182

packageManager/src/dependency/GitlabDependency.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ export class GitLabDependency extends Dependency {
195195
} else {
196196
this.addError(lock, message);
197197
}
198+
this.addOriginalError(lock, message, error);
198199
}
199200

200201
/**

packageManager/test/gitlab-dependency.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,23 @@ describe('GitLabDependency', () => {
309309
expect(lock.errors?.[0].message).toBe('Unable to find a release for group/project on GitLab satisfying version ^99.0.0');
310310
});
311311

312+
it('should preserve the original fetch error cause when release resolution throws', async () => {
313+
const spec: DependencySpec = { gitlab: 'group/project', version: 'highest' };
314+
const dep = new GitLabDependency(spec, true);
315+
316+
const tlsError = new Error('unable to verify the first certificate');
317+
const fetchError = new TypeError('fetch failed', { cause: tlsError });
318+
mockFetcher.getReleases = vi.fn().mockRejectedValue(fetchError);
319+
320+
const result = await dep.fetch(
321+
new Version('20.0.0'), mockEnv, lock, mockFetcher, mockCacheManager,
322+
);
323+
324+
expect(result).toBe(false);
325+
expect(lock.errors?.[0].message).toBe('Unable to find a release for group/project on GitLab satisfying version highest');
326+
expect(lock.errors?.[1].message).toBe('fetch failed: unable to verify the first certificate');
327+
});
328+
312329
it('should skip fetch when dependency is already cached', async () => {
313330
const spec: DependencySpec = { gitlab: 'group/project', version: '^1.0.0' };
314331
const dep = new GitLabDependency(spec, true);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { defineConfig } from 'vitest/config';
2+
3+
export default defineConfig({
4+
test: {
5+
globals: true,
6+
environment: 'node',
7+
include: ['test/live/package-manager.live.ts'],
8+
},
9+
});

0 commit comments

Comments
 (0)