Simplify ServiceConfigGenerator logic
Refactored ServiceConfigGenerator to remove favicon detection, special domain handling, and complex parsing. All services now generate uniform configurations with only 'name' and 'tld: "com"'.
This commit is contained in:
1 parent
24ea47c836
commit
000ec07851
1 file changed
+11
-183
@@ -1,11 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* Service Configuration Generator
|
* Service Configuration Generator
|
||||||
*
|
*
|
||||||
* Handles intelligent service configuration generation with:
|
* Simplified service configuration generator that creates
|
||||||
* - Smart favicon detection and URL generation
|
* uniform configurations for all services using the pattern:
|
||||||
* - Service-specific configuration logic
|
* { name: "serviceName", tld: "com" }
|
||||||
* - Complex domain patterns and special cases handling
|
|
||||||
* - Integration with xixu-me/favicons repository
|
|
||||||
*
|
*
|
||||||
* @author xixu-me
|
* @author xixu-me
|
||||||
* @license GPL-3.0
|
* @license GPL-3.0
|
||||||
@@ -14,103 +12,7 @@
|
|||||||
|
|
||||||
export class ServiceConfigGenerator {
|
export class ServiceConfigGenerator {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.faviconBaseUrl =
|
// Simplified constructor - no complex logic needed
|
||||||
"https://raw.githubusercontent.com/xixu-me/favicons/main/";
|
|
||||||
this.faviconCache = new Map();
|
|
||||||
|
|
||||||
// Special domain mappings for services that don't follow standard patterns
|
|
||||||
this.specialDomains = new Map([
|
|
||||||
["rednote", "xiaohongshu.com"],
|
|
||||||
["xai", "x.ai"],
|
|
||||||
["discord", "discord.com"],
|
|
||||||
["telegram", "t.me"],
|
|
||||||
["whatsapp", "web.whatsapp.com"],
|
|
||||||
["instagram", "instagram.com"],
|
|
||||||
["facebook", "facebook.com"],
|
|
||||||
["twitter", "twitter.com"],
|
|
||||||
["x", "x.com"],
|
|
||||||
["linkedin", "linkedin.com"],
|
|
||||||
["tiktok", "tiktok.com"],
|
|
||||||
["youtube", "youtube.com"],
|
|
||||||
["reddit", "reddit.com"],
|
|
||||||
["github", "github.com"],
|
|
||||||
["gitlab", "gitlab.com"],
|
|
||||||
["bitbucket", "bitbucket.org"],
|
|
||||||
["stackoverflow", "stackoverflow.com"],
|
|
||||||
["medium", "medium.com"],
|
|
||||||
["dev", "dev.to"],
|
|
||||||
["hashnode", "hashnode.com"],
|
|
||||||
["notion", "notion.so"],
|
|
||||||
["figma", "figma.com"],
|
|
||||||
["spotify", "spotify.com"],
|
|
||||||
["apple-music", "music.apple.com"],
|
|
||||||
["netflix", "netflix.com"],
|
|
||||||
["amazon", "amazon.com"],
|
|
||||||
["ebay", "ebay.com"],
|
|
||||||
["aliexpress", "aliexpress.com"],
|
|
||||||
["taobao", "taobao.com"],
|
|
||||||
["jd", "jd.com"],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if favicon exists for a service
|
|
||||||
* @param {string} serviceName - Service name to check
|
|
||||||
* @returns {Promise<boolean>} True if favicon exists
|
|
||||||
*/
|
|
||||||
async checkFaviconExists(serviceName) {
|
|
||||||
if (this.faviconCache.has(serviceName)) {
|
|
||||||
return this.faviconCache.get(serviceName);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await fetch(`${this.faviconBaseUrl}${serviceName}.svg`, {
|
|
||||||
method: "HEAD",
|
|
||||||
});
|
|
||||||
const exists = response.ok;
|
|
||||||
this.faviconCache.set(serviceName, exists);
|
|
||||||
return exists;
|
|
||||||
} catch (error) {
|
|
||||||
console.warn(`Failed to check favicon for ${serviceName}:`, error);
|
|
||||||
this.faviconCache.set(serviceName, false);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse domain into components (SLD and TLD)
|
|
||||||
* @param {string} domain - Domain to parse
|
|
||||||
* @returns {Object} Object with sld and tld properties
|
|
||||||
*/
|
|
||||||
parseDomain(domain) {
|
|
||||||
const parts = domain.split(".");
|
|
||||||
|
|
||||||
if (parts.length < 2) {
|
|
||||||
throw new Error(`Invalid domain: ${domain}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle special TLDs like .co.uk, .com.au, etc.
|
|
||||||
const specialTlds = [
|
|
||||||
"co.uk",
|
|
||||||
"com.au",
|
|
||||||
"co.jp",
|
|
||||||
"co.kr",
|
|
||||||
"com.br",
|
|
||||||
"co.in",
|
|
||||||
];
|
|
||||||
const lastTwoParts = parts.slice(-2).join(".");
|
|
||||||
|
|
||||||
if (specialTlds.includes(lastTwoParts)) {
|
|
||||||
return {
|
|
||||||
sld: parts[parts.length - 3] || parts[parts.length - 2],
|
|
||||||
tld: lastTwoParts,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
sld: parts[parts.length - 2],
|
|
||||||
tld: parts[parts.length - 1],
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -119,53 +21,11 @@ export class ServiceConfigGenerator {
|
|||||||
* @returns {Promise<Object>} Service configuration object
|
* @returns {Promise<Object>} Service configuration object
|
||||||
*/
|
*/
|
||||||
async generateServiceConfig(serviceName) {
|
async generateServiceConfig(serviceName) {
|
||||||
const config = { name: serviceName };
|
// Simplified: all services use name and tld: "com"
|
||||||
|
return {
|
||||||
// Check if service has special domain mapping
|
name: serviceName,
|
||||||
if (this.specialDomains.has(serviceName)) {
|
tld: "com",
|
||||||
const domain = this.specialDomains.get(serviceName);
|
};
|
||||||
|
|
||||||
// Check if favicon exists
|
|
||||||
const faviconExists = await this.checkFaviconExists(serviceName);
|
|
||||||
|
|
||||||
if (!faviconExists) {
|
|
||||||
// Use full domain if no favicon
|
|
||||||
config.domain = domain;
|
|
||||||
} else {
|
|
||||||
// Parse domain and use components
|
|
||||||
try {
|
|
||||||
const { sld, tld } = this.parseDomain(domain);
|
|
||||||
|
|
||||||
// If service name matches SLD, only use TLD
|
|
||||||
if (serviceName.toLowerCase() === sld.toLowerCase()) {
|
|
||||||
config.tld = tld;
|
|
||||||
} else {
|
|
||||||
// Service name doesn't match SLD, include both
|
|
||||||
config.sld = sld;
|
|
||||||
config.tld = tld;
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.warn(
|
|
||||||
`Failed to parse domain ${domain} for ${serviceName}:`,
|
|
||||||
error
|
|
||||||
);
|
|
||||||
config.domain = domain;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Standard service - assume serviceName.com pattern
|
|
||||||
const faviconExists = await this.checkFaviconExists(serviceName);
|
|
||||||
|
|
||||||
if (!faviconExists) {
|
|
||||||
// Fallback to full domain
|
|
||||||
config.domain = `${serviceName}.com`;
|
|
||||||
} else {
|
|
||||||
// Use TLD only
|
|
||||||
config.tld = "com";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return config;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -187,25 +47,8 @@ export class ServiceConfigGenerator {
|
|||||||
* @returns {string} String representation of configuration
|
* @returns {string} String representation of configuration
|
||||||
*/
|
*/
|
||||||
configToString(config) {
|
configToString(config) {
|
||||||
const parts = [`name: "${config.name}"`];
|
// Simplified: always use name and tld format
|
||||||
|
return `{ name: "${config.name}", tld: "${config.tld}" }`;
|
||||||
if (config.tld) {
|
|
||||||
parts.push(`tld: "${config.tld}"`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.sld) {
|
|
||||||
parts.push(`sld: "${config.sld}"`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.domain) {
|
|
||||||
parts.push(`domain: "${config.domain}"`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.alias) {
|
|
||||||
parts.push(`alias: "${config.alias}"`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return `{ ${parts.join(", ")} }`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -218,19 +61,4 @@ export class ServiceConfigGenerator {
|
|||||||
.map((config) => ` ${this.configToString(config)}`)
|
.map((config) => ` ${this.configToString(config)}`)
|
||||||
.join(",\n");
|
.join(",\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear favicon cache (useful for testing or forced refresh)
|
|
||||||
*/
|
|
||||||
clearCache() {
|
|
||||||
this.faviconCache.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get cached favicon status for debugging
|
|
||||||
* @returns {Map} Map of cached favicon statuses
|
|
||||||
*/
|
|
||||||
getCacheStatus() {
|
|
||||||
return new Map(this.faviconCache);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user