@dbs-portal/core-api
Version:
HTTP client and API utilities for DBS Portal
186 lines • 5.31 kB
JavaScript
/**
* 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