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