2025-12-03 21:56:50 +00:00
|
|
|
/**
|
|
|
|
|
* Utilitaires pour la manipulation des URLs
|
|
|
|
|
*/
|
|
|
|
|
|
2025-12-13 02:34:34 +00:00
|
|
|
export function buildUrl(
|
|
|
|
|
baseUrl: string,
|
|
|
|
|
path: string,
|
|
|
|
|
params?: Record<string, any>,
|
|
|
|
|
): string {
|
2025-12-03 21:56:50 +00:00
|
|
|
const url = new URL(path, baseUrl);
|
2025-12-13 02:34:34 +00:00
|
|
|
|
2025-12-03 21:56:50 +00:00
|
|
|
if (params) {
|
|
|
|
|
Object.entries(params).forEach(([key, value]) => {
|
|
|
|
|
if (value !== null && value !== undefined) {
|
|
|
|
|
url.searchParams.set(key, String(value));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-12-13 02:34:34 +00:00
|
|
|
|
2025-12-03 21:56:50 +00:00
|
|
|
return url.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function parseQueryString(queryString: string): Record<string, string> {
|
|
|
|
|
const params: Record<string, string> = {};
|
2025-12-13 02:34:34 +00:00
|
|
|
|
2025-12-03 21:56:50 +00:00
|
|
|
if (!queryString) return params;
|
2025-12-13 02:34:34 +00:00
|
|
|
|
2025-12-03 21:56:50 +00:00
|
|
|
const searchParams = new URLSearchParams(queryString);
|
|
|
|
|
searchParams.forEach((value, key) => {
|
|
|
|
|
params[key] = value;
|
|
|
|
|
});
|
2025-12-13 02:34:34 +00:00
|
|
|
|
2025-12-03 21:56:50 +00:00
|
|
|
return params;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function buildQueryString(params: Record<string, any>): string {
|
|
|
|
|
const searchParams = new URLSearchParams();
|
2025-12-13 02:34:34 +00:00
|
|
|
|
2025-12-03 21:56:50 +00:00
|
|
|
Object.entries(params).forEach(([key, value]) => {
|
|
|
|
|
if (value !== null && value !== undefined) {
|
|
|
|
|
searchParams.set(key, String(value));
|
|
|
|
|
}
|
|
|
|
|
});
|
2025-12-13 02:34:34 +00:00
|
|
|
|
2025-12-03 21:56:50 +00:00
|
|
|
return searchParams.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getUrlPathname(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
return new URL(url).pathname;
|
|
|
|
|
} catch {
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getUrlHostname(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
return new URL(url).hostname;
|
|
|
|
|
} catch {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function isAbsoluteUrl(url: string): boolean {
|
|
|
|
|
try {
|
|
|
|
|
new URL(url);
|
|
|
|
|
return true;
|
|
|
|
|
} catch {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function isRelativeUrl(url: string): boolean {
|
|
|
|
|
return !isAbsoluteUrl(url) && url.startsWith('/');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function normalizeUrl(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
return urlObj.toString();
|
|
|
|
|
} catch {
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function addQueryParam(url: string, key: string, value: string): string {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
urlObj.searchParams.set(key, value);
|
|
|
|
|
return urlObj.toString();
|
|
|
|
|
} catch {
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function removeQueryParam(url: string, key: string): string {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
urlObj.searchParams.delete(key);
|
|
|
|
|
return urlObj.toString();
|
|
|
|
|
} catch {
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getQueryParam(url: string, key: string): string | null {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
return urlObj.searchParams.get(key);
|
|
|
|
|
} catch {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function hasQueryParam(url: string, key: string): boolean {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
return urlObj.searchParams.has(key);
|
|
|
|
|
} catch {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function extractDomain(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
return new URL(url).hostname;
|
|
|
|
|
} catch {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function extractProtocol(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
return new URL(url).protocol;
|
|
|
|
|
} catch {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function extractPort(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
return new URL(url).port;
|
|
|
|
|
} catch {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function isValidUrl(url: string): boolean {
|
|
|
|
|
try {
|
|
|
|
|
new URL(url);
|
|
|
|
|
return true;
|
|
|
|
|
} catch {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function isSecureUrl(url: string): boolean {
|
|
|
|
|
try {
|
|
|
|
|
return new URL(url).protocol === 'https:';
|
|
|
|
|
} catch {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getUrlWithoutQuery(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
return `${urlObj.protocol}//${urlObj.host}${urlObj.pathname}`;
|
|
|
|
|
} catch {
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getUrlWithoutHash(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
return urlObj.toString().split('#')[0];
|
|
|
|
|
} catch {
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getHashFromUrl(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
return new URL(url).hash;
|
|
|
|
|
} catch {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function setHashInUrl(url: string, hash: string): string {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
urlObj.hash = hash;
|
|
|
|
|
return urlObj.toString();
|
|
|
|
|
} catch {
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function removeHashFromUrl(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
urlObj.hash = '';
|
|
|
|
|
return urlObj.toString();
|
|
|
|
|
} catch {
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getBaseUrl(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
|
|
|
|
return `${urlObj.protocol}//${urlObj.host}`;
|
|
|
|
|
} catch {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getRelativePath(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
return new URL(url).pathname;
|
|
|
|
|
} catch {
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function isSameOrigin(url1: string, url2: string): boolean {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj1 = new URL(url1);
|
|
|
|
|
const urlObj2 = new URL(url2);
|
|
|
|
|
return urlObj1.origin === urlObj2.origin;
|
|
|
|
|
} catch {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getUrlSegments(url: string): string[] {
|
|
|
|
|
try {
|
|
|
|
|
const pathname = new URL(url).pathname;
|
2025-12-13 02:34:34 +00:00
|
|
|
return pathname.split('/').filter((segment) => segment !== '');
|
2025-12-03 21:56:50 +00:00
|
|
|
} catch {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getLastUrlSegment(url: string): string {
|
|
|
|
|
const segments = getUrlSegments(url);
|
|
|
|
|
return segments[segments.length - 1] || '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getParentUrl(url: string): string {
|
|
|
|
|
try {
|
|
|
|
|
const urlObj = new URL(url);
|
2025-12-13 02:34:34 +00:00
|
|
|
const segments = urlObj.pathname
|
|
|
|
|
.split('/')
|
|
|
|
|
.filter((segment) => segment !== '');
|
2025-12-03 21:56:50 +00:00
|
|
|
segments.pop();
|
2025-12-13 02:34:34 +00:00
|
|
|
urlObj.pathname = `/${segments.join('/')}`;
|
2025-12-03 21:56:50 +00:00
|
|
|
return urlObj.toString();
|
|
|
|
|
} catch {
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
}
|