Files
Website/resources/js/helpers/url.ts
2023-04-21 15:46:12 +10:00

107 lines
3.4 KiB
TypeScript

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;
};