You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

36 lines
1000 B

function isFirstPageParamValue(raw: string): boolean {
const normalized = raw.trim()
if (!normalized) {
return false
}
if (/^\+?0*1(?:\.0+)?$/.test(normalized)) {
return true
}
const parsed = Number(normalized)
return Number.isFinite(parsed) && parsed === 1
}
export function buildPublicCanonicalUrl(siteUrlRaw: unknown, currentFullPath: unknown): string | null {
if (typeof siteUrlRaw !== 'string') {
return null
}
const siteUrl = siteUrlRaw.trim()
if (!siteUrl) {
return null
}
try {
const base = new URL(siteUrl)
const path = typeof currentFullPath === 'string' && currentFullPath.trim()
? currentFullPath.split('#', 1)[0]!
: '/'
const canonical = new URL(path, `${base.origin}/`)
const pageValues = canonical.searchParams.getAll('page')
if (pageValues.length > 0 && pageValues.every(isFirstPageParamValue)) {
canonical.searchParams.delete('page')
}
return canonical.href
}
catch {
return null
}
}