UNPKG

@dbs-portal/core-api

Version:

HTTP client and API utilities for DBS Portal

186 lines 5.31 kB
/** * URL and path utilities for MSW handlers */ /** * Parse query parameters from URL */ export function parseQueryParams(url) { const urlObj = typeof url === 'string' ? new URL(url) : url; const params = {}; for (const [key, value] of urlObj.searchParams.entries()) { params[key] = value; } return params; } /** * Parse path parameters from URL pattern */ export function parsePathParams(url, pattern) { const params = {}; // Convert pattern to regex const regexPattern = pattern.replace(/:([^/]+)/g, '([^/]+)'); const regex = new RegExp(`^${regexPattern}$`); // Extract parameter names const paramNames = (pattern.match(/:([^/]+)/g) || []).map(param => param.slice(1)); // Match URL against pattern const match = url.match(regex); if (match) { paramNames.forEach((name, index) => { const value = match[index + 1]; if (value !== undefined) { params[name] = value; } }); } return params; } /** * Build URL with query parameters */ export function buildUrl(baseUrl, params) { if (!params || Object.keys(params).length === 0) { return baseUrl; } const url = new URL(baseUrl, 'http://localhost'); // Use dummy base for relative URLs for (const [key, value] of Object.entries(params)) { if (value !== undefined && value !== null) { url.searchParams.set(key, String(value)); } } return url.pathname + url.search; } /** * Extract base path from URL */ export function extractBasePath(url) { try { const urlObj = new URL(url, 'http://localhost'); return urlObj.pathname; } catch { return url; } } /** * Check if URL matches pattern */ export function matchesPattern(url, pattern) { const regexPattern = pattern.replace(/:([^/]+)/g, '([^/]+)'); const regex = new RegExp(`^${regexPattern}$`); return regex.test(url); } /** * Normalize URL path */ export function normalizePath(path) { return path .replace(/\/+/g, '/') // Replace multiple slashes with single slash .replace(/\/$/, '') // Remove trailing slash .replace(/^(?!\/)/, '/'); // Ensure leading slash } /** * Join URL paths */ export function joinPaths(...paths) { return normalizePath(paths.join('/')); } /** * Parse pagination parameters from query */ export function parsePaginationParams(query) { const page = Math.max(1, Number.parseInt(query['page'] || '1', 10)); const pageSize = Math.max(1, Math.min(100, Number.parseInt(query['pageSize'] || query['limit'] || '10', 10))); const skip = (page - 1) * pageSize; const take = pageSize; return { page, pageSize, skip, take }; } /** * Parse sorting parameters from query */ export function parseSortingParams(query) { const sortBy = query['sortBy'] || query['orderBy'] || query['sort']; const sortOrder = (query['sortOrder'] || query['order'] || 'asc').toLowerCase() === 'desc' ? 'desc' : 'asc'; return { ...(sortBy && { sortBy }), sortOrder }; } /** * Parse filtering parameters from query */ export function parseFilterParams(query) { const search = query['search'] || query['q']; const filter = query['filter']; // Extract all filter parameters (those starting with 'filter.') const filters = {}; for (const [key, value] of Object.entries(query)) { if (key.startsWith('filter.')) { const filterKey = key.replace('filter.', ''); filters[filterKey] = value; } } return { ...(search && { search }), ...(filter && { filter }), filters }; } /** * Create URL matcher function */ export function createUrlMatcher(patterns) { const regexes = patterns.map(pattern => { const regexPattern = pattern.replace(/:([^/]+)/g, '([^/]+)'); return new RegExp(`^${regexPattern}$`); }); return (url) => { return regexes.some(regex => regex.test(url)); }; } /** * Extract file extension from URL */ export function getFileExtension(url) { const path = extractBasePath(url); const match = path.match(/\.([^.]+)$/); return match && match[1] ? match[1].toLowerCase() : null; } /** * Check if URL is for a file download */ export function isFileDownloadUrl(url) { const path = extractBasePath(url); return /\.(pdf|doc|docx|xls|xlsx|csv|zip|tar|gz|jpg|jpeg|png|gif|svg)$/i.test(path); } /** * Generate mock URL for uploaded file */ export function generateFileUrl(filename, baseUrl = '/uploads') { const timestamp = Date.now(); const extension = filename.split('.').pop(); const nameWithoutExt = filename.replace(/\.[^/.]+$/, ''); const sanitizedName = nameWithoutExt.replace(/[^a-zA-Z0-9-_]/g, '_'); return `${baseUrl}/${timestamp}_${sanitizedName}.${extension}`; } /** * Validate URL format */ export function isValidUrl(url) { try { new URL(url); return true; } catch { return false; } } /** * Convert relative URL to absolute */ export function toAbsoluteUrl(url, baseUrl = 'http://localhost:3000') { if (isValidUrl(url)) { return url; } return new URL(url, baseUrl).toString(); } //# sourceMappingURL=url-utils.js.map