Skip to content

Commit 5d89eba

Browse files
chore: make source title better (#18)
1 parent 47119ef commit 5d89eba

3 files changed

Lines changed: 75 additions & 17 deletions

File tree

package-lock.json

Lines changed: 20 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@tailwindcss/vite": "^4.1.8",
2525
"@types/js-yaml": "^4.0.9",
2626
"@types/node": "^22.15.30",
27+
"@types/psl": "^1.1.3",
2728
"eslint": "^9.28.0",
2829
"eslint-config-prettier": "^10.1.5",
2930
"eslint-plugin-svelte": "^3.9.1",
@@ -42,6 +43,7 @@
4243
},
4344
"dependencies": {
4445
"@tanstack/svelte-query": "^5.80.6",
45-
"js-yaml": "^4.1.0"
46+
"js-yaml": "^4.1.0",
47+
"psl": "^1.15.0"
4648
}
4749
}

src/components/SourceCard.svelte

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
House,
2020
Package
2121
} from 'phosphor-svelte';
22+
import * as psl from 'psl';
2223
import type { DataSource } from '../lib/types';
2324
2425
export let sources: DataSource[] = [];
@@ -27,26 +28,63 @@
2728
let showAll = false;
2829
let copiedStates: { [key: string]: boolean } = {};
2930
30-
const DOMAIN_CONFIG: { [domain: string]: { name: string; icon: any } } = {
31-
'airbnb.com': { name: 'Airbnb', icon: House },
32-
'amazon.com': { name: 'Amazon', icon: AmazonLogo },
33-
'facebook.com': { name: 'Facebook', icon: FacebookLogo },
34-
'instagram.com': { name: 'Instagram', icon: InstagramLogo },
35-
'linkedin.com': { name: 'LinkedIn', icon: LinkedinLogo },
31+
type DomainConfigType = {
32+
[key: string]: { name?: string; icon: typeof Globe };
33+
};
34+
35+
const DOMAIN_CONFIG: DomainConfigType = {
36+
'airbnb.com': { icon: House },
37+
'amazon.com': { icon: AmazonLogo },
38+
'facebook.com': { icon: FacebookLogo },
39+
'instagram.com': { icon: InstagramLogo },
40+
'linkedin.com': { icon: LinkedinLogo },
3641
'twitter.com': { name: 'X (Twitter)', icon: TwitterLogo },
3742
'x.com': { name: 'X (Twitter)', icon: TwitterLogo },
38-
'youtube.com': { name: 'YouTube', icon: YoutubeLogo },
39-
'google.com': { name: 'Google', icon: GoogleLogo },
40-
'indeed.com': { name: 'Indeed', icon: Briefcase },
43+
'youtube.com': { icon: YoutubeLogo },
44+
'google.com': { icon: GoogleLogo },
45+
'indeed.com': { icon: Briefcase },
4146
'ebay.com': { name: 'eBay', icon: ShoppingBag },
42-
'crunchbase.com': { name: 'Crunchbase', icon: Rocket },
43-
'walmart.com': { name: 'Walmart', icon: ShoppingBag },
44-
'yahoo.com': { name: 'Yahoo', icon: ChartLineUp }
47+
'crunchbase.com': { icon: Rocket },
48+
'walmart.com': { icon: ShoppingBag },
49+
'yahoo.com': { icon: ChartLineUp }
4550
};
4651
52+
function generateDisplayName(domain: string): string {
53+
try {
54+
const parsed = psl.parse(domain.toLowerCase().replace(/^www\./, ''));
55+
56+
if (parsed.error || !parsed.domain) {
57+
return domain.charAt(0).toUpperCase() + domain.slice(1);
58+
}
59+
60+
const domainName = parsed.domain.split('.')[0];
61+
62+
return domainName
63+
.split('-')
64+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
65+
.join(' ');
66+
} catch {
67+
return domain.charAt(0).toUpperCase() + domain.slice(1);
68+
}
69+
}
70+
4771
function getDomainConfig(domain: string) {
48-
const config = DOMAIN_CONFIG[domain.toLowerCase()];
49-
return config || { name: domain, icon: Globe };
72+
try {
73+
const parsed = psl.parse(domain.toLowerCase().replace(/^www\./, ''));
74+
const actualDomain = parsed.error || !parsed.domain ? domain : parsed.domain;
75+
76+
const config = DOMAIN_CONFIG[actualDomain.toLowerCase()] || {};
77+
return {
78+
name: config.name || generateDisplayName(domain),
79+
icon: config.icon || Globe
80+
};
81+
} catch {
82+
const config = DOMAIN_CONFIG[domain.toLowerCase()] || {};
83+
return {
84+
name: config.name || generateDisplayName(domain),
85+
icon: config.icon || Globe
86+
};
87+
}
5088
}
5189
5290
function groupSourcesByEndpoint(sources: DataSource[]) {

0 commit comments

Comments
 (0)