[Glitch] Profile editing: Add warning for links

Port 12c6c6dcf9 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
Echo authored and Claire committed 2026-03-11 18:54:22 +01:00
1 parent 3ed3ce4e05
commit 006b06199f
3 files changed
+66 -1

No files matched your search

@@ -0,0 +1,21 @@
import { isUrlWithoutProtocol } from './checks';
describe('isUrlWithoutProtocol', () => {
test.concurrent.each([
['example.com', true],
['sub.domain.co.uk', true],
['example', false], // No dot
['example..com', false], // Consecutive dots
['example.com.', false], // Trailing dot
['example.c', false], // TLD too short
['example.123', false], // Numeric TLDs are not valid
['example.com/path', true], // Paths are allowed
['example.com?query=string', true], // Query strings are allowed
['example.com#fragment', true], // Fragments are allowed
['example .com', false], // Spaces are not allowed
['example://com', false], // Protocol inside the string is not allowed
['example.com^', false], // Invalid characters not allowed
])('should return %s for input "%s"', (input, expected) => {
expect(isUrlWithoutProtocol(input)).toBe(expected);
});
});
@@ -9,3 +9,29 @@ export function isValidUrl(
return false;
}
}
/**
* Checks if the input string is probably a URL without a protocol. Note this is not full URL validation,
* and is mostly used to detect link-like inputs.
* @see https://www.xjavascript.com/blog/check-if-a-javascript-string-is-a-url/
* @param input The input string to check
*/
export function isUrlWithoutProtocol(input: string): boolean {
if (!input.length || input.includes(' ') || input.includes('://')) {
return false;
}
try {
const url = new URL(`http://${input}`);
const { host } = url;
return (
host !== '' && // Host is not empty
host.includes('.') && // Host contains at least one dot
!host.endsWith('.') && // No trailing dot
!host.includes('..') && // No consecutive dots
/\.[\w]{2,}$/.test(host) // TLD is at least 2 characters
);
} catch {}
return false;
}