|
19 | 19 | House, |
20 | 20 | Package |
21 | 21 | } from 'phosphor-svelte'; |
| 22 | + import * as psl from 'psl'; |
22 | 23 | import type { DataSource } from '../lib/types'; |
23 | 24 |
|
24 | 25 | export let sources: DataSource[] = []; |
|
27 | 28 | let showAll = false; |
28 | 29 | let copiedStates: { [key: string]: boolean } = {}; |
29 | 30 |
|
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 }, |
36 | 41 | 'twitter.com': { name: 'X (Twitter)', icon: TwitterLogo }, |
37 | 42 | '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 }, |
41 | 46 | '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 } |
45 | 50 | }; |
46 | 51 |
|
| 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 | +
|
47 | 71 | 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 | + } |
50 | 88 | } |
51 | 89 |
|
52 | 90 | function groupSourcesByEndpoint(sources: DataSource[]) { |
|
0 commit comments