import { Router } from "vue-router"; export const urlStripAttributes = (url: string): string => { const urlObject = new URL(url); urlObject.search = ""; urlObject.hash = ""; return urlObject.toString(); }; export const urlMatches = ( fullUrl: string, testPath: string | string[] ): boolean | number => { // Remove query string and fragment identifier from both URLs const urlWithoutParams = fullUrl.split(/[?#]/)[0]; if (Array.isArray(testPath)) { // Iterate over the array of test paths and return the index of the first matching path for (let i = 0; i < testPath.length; i++) { const pathWithoutParams = testPath[i].split(/[?#]/)[0]; // Remove trailing slashes from both URLs const trimmedUrl = urlWithoutParams.replace(/\/$/, ""); const trimmedPath = pathWithoutParams.replace(/\/$/, ""); // Check if both URLs contain a domain and port const hasDomainAndPort = /^https?:\/\/[^/]+\//.test(trimmedUrl) && /^https?:\/\/[^/]+\//.test(trimmedPath); if (hasDomainAndPort) { // Do a full test with both URLs if (trimmedUrl === trimmedPath) { return i; } } else { // Remove the domain and test the paths const urlWithoutDomain = trimmedUrl.replace( /^https?:\/\/[^/]+/, "" ); const pathWithoutDomain = trimmedPath.replace( /^https?:\/\/[^/]+/, "" ); if (urlWithoutDomain === pathWithoutDomain) { return i; } } } // If no matching path is found, return false return false; } else { const pathWithoutParams = testPath.split(/[?#]/)[0]; // Remove trailing slashes from both URLs const trimmedUrl = urlWithoutParams.replace(/\/$/, ""); const trimmedPath = pathWithoutParams.replace(/\/$/, ""); // Check if both URLs contain a domain and port const hasDomainAndPort = /^https?:\/\/[^/]+\//.test(trimmedUrl) && /^https?:\/\/[^/]+\//.test(trimmedPath); if (hasDomainAndPort) { // Do a full test with both URLs return trimmedUrl === trimmedPath; } else { // Remove the domain and test the paths const urlWithoutDomain = trimmedUrl.replace( /^https?:\/\/[^/]+/, "" ); const pathWithoutDomain = trimmedPath.replace( /^https?:\/\/[^/]+/, "" ); return urlWithoutDomain === pathWithoutDomain; } } }; interface Params { [key: string]: string; } export const updateRouterParams = (router: Router, params: Params): void => { const query = { ...router.currentRoute.value.query }; Object.entries(params).forEach(([key, value]) => { if (value === "") { if (key in params) { delete query[key]; } } else { query[key] = value; } }); router.push({ query }); }; export const extractFileNameFromUrl = (url: string): string => { const matches = url.match(/\/([^/]+\.[^/]+)$/); if (!matches) { return ""; } const fileName = matches[1]; return fileName; };