type QueryValue = string | number | boolean | null | undefined | (string | number | boolean)[];
export function buildUrl(base: string, params: Record<string, QueryValue> = {}): string {
const url = new URL(base, typeof window === 'undefined' ? 'http://placeholder' : window.location.href);
for (const [k, v] of Object.entries(params)) {
if (v === null || v === undefined) continue;
if (Array.isArray(v)) v.forEach(item => url.searchParams.append(k, String(item)));
else url.searchParams.set(k, String(v));
}
// If `base` was already absolute, return the full URL; otherwise return path+search.
return /^https?:\/\//i.test(base) ? url.toString() : url.pathname + url.search;
}
buildUrl('/api/users', { active: true, role: ['admin', 'editor'], page: 1, q: null });
// '/api/users?active=true&role=admin&role=editor&page=1'
Create a free account and build your private vault. Share publicly whenever you want.