Major categories fixed: - TS6133 (188): Remove unused imports (React, icons, types) and variables - TS2322 (222): Fix type mismatches in stories (satisfies Meta -> const meta: Meta), add nullish coalescing for optional values, fix component prop types - TS2345 (43): Fix argument type mismatches with proper null checks and type narrowing - TS2741 (21): Add missing required properties to mock/story data - TS2339 (19): Fix property access on incorrect types, add type guards - TS2353 (13): Remove extra properties from object literals or extend interfaces - TS2352 (11): Fix type conversion chains - TS2307 (9): Fix import paths and module references - Other (42): Fix implicit any, possibly undefined, export declarations Vite build and tsc --noEmit both pass cleanly. Co-authored-by: Cursor <cursoragent@cursor.com>
264 lines
5.2 KiB
TypeScript
264 lines
5.2 KiB
TypeScript
/**
|
|
* Utilitaires pour la manipulation des URLs
|
|
*/
|
|
|
|
export function buildUrl(
|
|
baseUrl: string,
|
|
path: string,
|
|
params?: Record<string, any>,
|
|
): string {
|
|
const url = new URL(path, baseUrl);
|
|
|
|
if (params) {
|
|
Object.entries(params).forEach(([key, value]) => {
|
|
if (value !== null && value !== undefined) {
|
|
url.searchParams.set(key, String(value));
|
|
}
|
|
});
|
|
}
|
|
|
|
return url.toString();
|
|
}
|
|
|
|
export function parseQueryString(queryString: string): Record<string, string> {
|
|
const params: Record<string, string> = {};
|
|
|
|
if (!queryString) return params;
|
|
|
|
const searchParams = new URLSearchParams(queryString);
|
|
searchParams.forEach((value, key) => {
|
|
params[key] = value;
|
|
});
|
|
|
|
return params;
|
|
}
|
|
|
|
export function buildQueryString(params: Record<string, any>): string {
|
|
const searchParams = new URLSearchParams();
|
|
|
|
Object.entries(params).forEach(([key, value]) => {
|
|
if (value !== null && value !== undefined) {
|
|
searchParams.set(key, String(value));
|
|
}
|
|
});
|
|
|
|
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] ?? url;
|
|
} 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;
|
|
return pathname.split('/').filter((segment) => segment !== '');
|
|
} 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);
|
|
const segments = urlObj.pathname
|
|
.split('/')
|
|
.filter((segment) => segment !== '');
|
|
segments.pop();
|
|
urlObj.pathname = `/${segments.join('/')}`;
|
|
return urlObj.toString();
|
|
} catch {
|
|
return url;
|
|
}
|
|
}
|