18d307f52SEvan Baconimport { URL } from 'url';
28d307f52SEvan Bacon
38d307f52SEvan Baconimport { FetchLike } from './client.types';
48d307f52SEvan Bacon
56079da0aSEvan Baconconst debug = require('debug')('expo:api:fetch:base') as typeof console.log;
66079da0aSEvan Bacon
78d307f52SEvan Bacon/**
88d307f52SEvan Bacon * Wrap a fetch function with support for a predefined base URL.
98d307f52SEvan Bacon * This implementation works like the browser fetch, applying the input to a prefix base URL.
108d307f52SEvan Bacon */
118d307f52SEvan Baconexport function wrapFetchWithBaseUrl(fetch: FetchLike, baseUrl: string): FetchLike {
12*82f3de79SEvan Bacon  // NOTE(EvanBacon): DO NOT RETURN AN ASYNC WRAPPER. THIS BREAKS LOADING INDICATORS.
138d307f52SEvan Bacon  return (url, init) => {
148d307f52SEvan Bacon    if (typeof url !== 'string') {
158d307f52SEvan Bacon      throw new TypeError('Custom fetch function only accepts a string URL as the first parameter');
168d307f52SEvan Bacon    }
178d307f52SEvan Bacon    const parsed = new URL(url, baseUrl);
1829975bfdSEvan Bacon    if (init?.searchParams) {
198d307f52SEvan Bacon      parsed.search = init.searchParams.toString();
208d307f52SEvan Bacon    }
216079da0aSEvan Bacon    debug('fetch:', parsed.toString().trim());
228d307f52SEvan Bacon    return fetch(parsed.toString(), init);
238d307f52SEvan Bacon  };
248d307f52SEvan Bacon}
25