+async function request(url, options = {}) {
+ let requestUrl = url;
+
+ if (!requestUrl.startsWith('http')) {
+ requestUrl = window.baseUrl(requestUrl);
+ }
+
+ if (options.params) {
+ const urlObj = new URL(requestUrl);
+ for (const paramName of Object.keys(options.params)) {
+ const value = options.params[paramName];
+ if (typeof value !== 'undefined' && value !== null) {
+ urlObj.searchParams.set(paramName, value);
+ }
+ }
+ requestUrl = urlObj.toString();
+ }
+
+ const csrfToken = document.querySelector('meta[name=token]').getAttribute('content');
+ const requestOptions = {...options, credentials: 'same-origin'};
+ requestOptions.headers = {
+ ...requestOptions.headers || {},
+ baseURL: window.baseUrl(''),
+ 'X-CSRF-TOKEN': csrfToken,
+ };
+
+ const response = await fetch(requestUrl, requestOptions);
+ const content = await getResponseContent(response);
+ const returnData = {
+ data: content,
+ headers: response.headers,
+ redirected: response.redirected,
+ status: response.status,
+ statusText: response.statusText,
+ url: response.url,
+ original: response,
+ };
+
+ if (!response.ok) {
+ throw new HttpError(response, content);
+ }
+
+ return returnData;