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