63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
// List of known multi-part TLDs that should be treated as single domains
|
|
const MULTI_PART_TLDS = [
|
|
/com\.\w{2}$/,
|
|
/co\.\w{2}$/,
|
|
/ac\.\w{2}$/,
|
|
/net\.\w{2}$/,
|
|
/org\.\w{2}$/,
|
|
/gov\.\w{2}$/,
|
|
/edu\.\w{2}$/,
|
|
/nhs\.\w{2}$/,
|
|
/or\.\w{2}$/,
|
|
/go\.\w{2}$/,
|
|
];
|
|
|
|
export const parseCookieDomain = (url: string) => {
|
|
if (!url) {
|
|
return {
|
|
domain: undefined,
|
|
secure: false,
|
|
};
|
|
}
|
|
|
|
const domain = new URL(url);
|
|
const hostname = domain.hostname;
|
|
|
|
// For localhost or IP addresses, don't set domain
|
|
if (hostname === 'localhost' || /^\d+\.\d+\.\d+\.\d+$/.test(hostname)) {
|
|
return {
|
|
domain: undefined,
|
|
secure: domain.protocol === 'https:',
|
|
};
|
|
}
|
|
|
|
const parts = hostname.split('.');
|
|
|
|
// Handle multi-part TLDs like co.uk, com.au, etc.
|
|
if (parts.length >= 3) {
|
|
const potentialTLD = parts.slice(-2).join('.');
|
|
if (MULTI_PART_TLDS.some((tld) => tld.test(potentialTLD))) {
|
|
// For domains like example.co.uk or subdomain.example.co.uk
|
|
// Use the last 3 parts: .example.co.uk
|
|
return {
|
|
domain: `.${parts.slice(-3).join('.')}`,
|
|
secure: domain.protocol === 'https:',
|
|
};
|
|
}
|
|
}
|
|
|
|
// For regular subdomains, use the last 2 parts
|
|
if (parts.length > 2) {
|
|
return {
|
|
domain: `.${parts.slice(-2).join('.')}`,
|
|
secure: domain.protocol === 'https:',
|
|
};
|
|
}
|
|
|
|
// For root domains, use the full domain with leading dot
|
|
return {
|
|
domain: `.${hostname}`,
|
|
secure: domain.protocol === 'https:',
|
|
};
|
|
};
|