40 lines
942 B
JavaScript
40 lines
942 B
JavaScript
function normalizeMediaPath(value) {
|
|
if (value === undefined) return undefined
|
|
if (value === null) return null
|
|
|
|
const raw = String(value).trim()
|
|
if (!raw) return null
|
|
|
|
const lower = raw.toLowerCase()
|
|
if (
|
|
lower.startsWith("javascript:") ||
|
|
lower.startsWith("data:") ||
|
|
lower.startsWith("vbscript:")
|
|
) {
|
|
return null
|
|
}
|
|
|
|
try {
|
|
if (raw.startsWith("http://") || raw.startsWith("https://")) {
|
|
const parsed = new URL(raw)
|
|
return parsed.pathname || "/"
|
|
}
|
|
|
|
if (raw.startsWith("//")) {
|
|
const parsed = new URL(`https:${raw}`)
|
|
return parsed.pathname || "/"
|
|
}
|
|
|
|
const domainLike = /^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(\/|$)/i.test(raw)
|
|
if (domainLike) {
|
|
const parsed = new URL(`https://${raw}`)
|
|
return parsed.pathname || "/"
|
|
}
|
|
} catch {}
|
|
|
|
if (raw.startsWith("/")) return raw
|
|
return `/${raw.replace(/^\/+/, "")}`
|
|
}
|
|
|
|
module.exports = { normalizeMediaPath }
|