[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:
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;
|
||||
}
|
||||
Reference in new issue
Block a user