File size: 2,348 Bytes
52c6f5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { describe, expect, it } from "vitest";
import { extractDomain } from "./url.js";

describe("extractDomain", () => {
	it("should handle regular domains", () => {
		expect(extractDomain("https://example.com")).toBe("example.com");
	});

	it("should handle single subdomains", () => {
		expect(extractDomain("https://sub.example.com")).toBe("example.com");
	});

	it("should handle multiple subdomains", () => {
		expect(extractDomain("https://sub1.sub2.example.com")).toBe("example.com");
		expect(extractDomain("https://deep.sub.domain.co.uk")).toBe("domain.co.uk");
		expect(extractDomain("https://a.b.c.d.e.f.g.example.net")).toBe("example.net");
	});

	it("should handle special TLDs like co.uk", () => {
		expect(extractDomain("https://domain.co.uk")).toBe("domain.co.uk");
		expect(extractDomain("https://sub.domain.co.uk")).toBe("domain.co.uk");
		expect(extractDomain("https://another.domain.com.au")).toBe("domain.com.au");
	});

	it("should handle localhost", () => {
		expect(extractDomain("http://localhost:3000")).toBe("localhost");
		expect(extractDomain("http://localhost")).toBe("localhost");
	});

	it("should handle non-HTTP/HTTPS protocols", () => {
		expect(extractDomain("ftp://files.example.com")).toBe("example.com");
		expect(extractDomain("ws://websocket.example.com")).toBe("example.com");
	});

	it("should handle non-string values", () => {
		expect(extractDomain(12345)).toBeNull();
		expect(extractDomain({})).toBeNull();
		expect(extractDomain(["https://example.com"])).toBeNull();
		expect(extractDomain(true)).toBeNull();
	});

	it("should handle URL instances", () => {
		expect(extractDomain(new URL("https://test.example.com"))).toBe("example.com");
		expect(extractDomain(new URL("https://deeply.nested.subdomain.example.org"))).toBe("example.org");
	});

	it("should handle invalid URLs gracefully", () => {
		expect(extractDomain("not-a-url")).toBeNull();
		expect(extractDomain("htt:invalid-url")).toBeNull();
		expect(extractDomain("example")).toBeNull();
		expect(extractDomain("http://")).toBeNull();
	});

	it("should handle tricky but valid URLs", () => {
		expect(extractDomain("https://example.com#hash")).toBe("example.com");
		expect(extractDomain("https://example.com/path")).toBe("example.com");
		expect(extractDomain("https://example.com/path?query=string")).toBe("example.com");
	});
});