Skip to content

Commit cbd9d08

Browse files
authored
fix(core): support relative links in enqueueLinks explicitly provided via urls option (#2014)
Closes #2005
1 parent 8c0928b commit cbd9d08

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

packages/core/src/enqueue_links/shared.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,19 +208,21 @@ export function filterRequestsByPatterns(requests: Request[], patterns?: UrlPatt
208208
*/
209209
export function createRequestOptions(
210210
sources: (string | Record<string, unknown>)[],
211-
options: Pick<EnqueueLinksOptions, 'label' | 'userData'> = {},
211+
options: Pick<EnqueueLinksOptions, 'label' | 'userData' | 'baseUrl'> = {},
212212
): RequestOptions[] {
213213
return sources
214214
.map((src) => (typeof src === 'string' ? { url: src } : src as unknown as RequestOptions))
215215
.filter(({ url }) => {
216216
try {
217-
return new URL(url).href;
217+
return new URL(url, options.baseUrl).href;
218218
} catch (err) {
219219
return false;
220220
}
221221
})
222222
.map((requestOptions) => {
223+
requestOptions.url = new URL(requestOptions.url, options.baseUrl).href;
223224
requestOptions.userData ??= options.userData ?? {};
225+
224226
if (typeof options.label === 'string') {
225227
requestOptions.userData = {
226228
...requestOptions.userData,

test/core/enqueue_links/enqueue_links.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,29 @@ describe('enqueueLinks()', () => {
853853
expect(enqueued[2].userData).toEqual({});
854854
});
855855

856+
test('correctly resolves relative URLs with `urls` option', async () => {
857+
const { enqueued, requestQueue } = createRequestQueueMock();
858+
await cheerioCrawlerEnqueueLinks({
859+
options: {
860+
baseUrl: 'http://www.absolute.com/removethis/',
861+
urls: ['/relative/url1', '/relative/url2'],
862+
},
863+
$,
864+
requestQueue,
865+
originalRequestUrl: 'https://example.com',
866+
});
867+
868+
expect(enqueued).toHaveLength(2);
869+
870+
expect(enqueued[0].url).toBe('http://www.absolute.com/relative/url1');
871+
expect(enqueued[0].method).toBe('GET');
872+
expect(enqueued[0].userData).toEqual({});
873+
874+
expect(enqueued[1].url).toBe('http://www.absolute.com/relative/url2');
875+
expect(enqueued[1].method).toBe('GET');
876+
expect(enqueued[1].userData).toEqual({});
877+
});
878+
856879
test('correctly works with transformRequestFunction', async () => {
857880
const { enqueued, requestQueue } = createRequestQueueMock();
858881
const pseudoUrls = [

0 commit comments

Comments
 (0)