From 48b6ae2553763a85437745f9f519acfec9013347 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Sun, 26 May 2024 02:55:57 +0800 Subject: [PATCH] Refactor: refactor domain sorting order --- Build/lib/stable-sort-domain.test.ts | 74 ++++++++++++++++++++++++++++ Build/lib/stable-sort-domain.ts | 41 +++++++++------ 2 files changed, 101 insertions(+), 14 deletions(-) diff --git a/Build/lib/stable-sort-domain.test.ts b/Build/lib/stable-sort-domain.test.ts index f517cf15..f983fe4c 100644 --- a/Build/lib/stable-sort-domain.test.ts +++ b/Build/lib/stable-sort-domain.test.ts @@ -75,4 +75,78 @@ describe('sortDomains', () => { '.ec2-25-58-215-234.us-east-2.compute.amazonaws.com' ]); }); + + it('samsung test case', () => { + expect(sortDomains([ + '.notice.samsungcloudsolution.com', + 'samsungqbe.com', + 'samsungcloudsolution.com' + ])).toStrictEqual([ + 'samsungqbe.com', + 'samsungcloudsolution.com', + '.notice.samsungcloudsolution.com' + ]); + + expect( + sortDomains([ + '.notice.samsungcloudsolution.com', + '.vdterms.samsungcloudsolution.com', + '.gamespromotion.samsungcloudsolution.com', + '.samsunggiveaways.com', + '.gld.samsungosp.com', + 'samsungqbe.com', + 'samsungcloudsolution.com', + '.sas.samsungcloudsolution.com', + '.prov.samsungcloudsolution.com', + '.musicid.samsungcloudsolution.com', + '.amauthprd.samsungcloudsolution.com', + '.noticecdn.samsungcloudsolution.com', + '.abtauthprd.samsungcloudsolution.com', + '.noticefile.samsungcloudsolution.com', + '.prderrordumphsm.samsungcloudsolution.com', + 'samsungcloudsolution.net', + '.cdn.samsungcloudsolution.net', + '.lcprd1.samsungcloudsolution.net', + '.lcprd2.samsungcloudsolution.net', + '.samsungelectronics.com', + '.analytics-api.samsunghealthcn.com', + '.tracking.samsungknox.com', + '.analytics.samsungknox.com', + '.metrics.samsunglife.com', + '.smetrics.samsunglife.com', + '.nmetrics.samsungmobile.com', + '.rwww.samsungotn.net', + '.samsungpoland.com.pl' + ]) + ).toStrictEqual([ + '.gld.samsungosp.com', + '.rwww.samsungotn.net', + 'samsungqbe.com', + '.tracking.samsungknox.com', + '.analytics.samsungknox.com', + '.metrics.samsunglife.com', + '.smetrics.samsunglife.com', + '.nmetrics.samsungmobile.com', + '.analytics-api.samsunghealthcn.com', + '.samsunggiveaways.com', + '.samsungpoland.com.pl', + '.samsungelectronics.com', + 'samsungcloudsolution.com', + '.sas.samsungcloudsolution.com', + '.prov.samsungcloudsolution.com', + '.notice.samsungcloudsolution.com', + '.musicid.samsungcloudsolution.com', + '.vdterms.samsungcloudsolution.com', + '.amauthprd.samsungcloudsolution.com', + '.noticecdn.samsungcloudsolution.com', + '.abtauthprd.samsungcloudsolution.com', + '.noticefile.samsungcloudsolution.com', + '.gamespromotion.samsungcloudsolution.com', + '.prderrordumphsm.samsungcloudsolution.com', + 'samsungcloudsolution.net', + '.cdn.samsungcloudsolution.net', + '.lcprd1.samsungcloudsolution.net', + '.lcprd2.samsungcloudsolution.net' + ]); + }); }); diff --git a/Build/lib/stable-sort-domain.ts b/Build/lib/stable-sort-domain.ts index b5ce578e..ee29379b 100644 --- a/Build/lib/stable-sort-domain.ts +++ b/Build/lib/stable-sort-domain.ts @@ -14,27 +14,40 @@ export const compare = (a: string, b: string) => { const tldtsOpt = { allowPrivateDomains: false, detectIp: false, validateHostname: false }; export const sortDomains = (inputs: string[]) => { - const domains = inputs.reduce>((domains, cur) => { - if (!domains.has(cur)) { + const domainMap = new Map(); + const subdomainMap = new Map(); + + for (let i = 0, len = inputs.length; i < len; i++) { + const cur = inputs[i]; + if (!domainMap.has(cur)) { const topD = tldts.getDomain(cur, tldtsOpt); - domains.set(cur, topD ?? cur); - }; - return domains; - }, new Map()); + domainMap.set(cur, topD ?? cur); + } + if (!subdomainMap.has(cur)) { + const subD = tldts.getSubdomain(cur, tldtsOpt); + subdomainMap.set(cur, subD ?? cur); + } + } const sorter = (a: string, b: string) => { if (a === b) return 0; - const $a = domains.get(a)!; - const $b = domains.get(b)!; + const main_domain_a = domainMap.get(a)!; + const main_domain_b = domainMap.get(b)!; - if (a === $a && b === $b) { - return compare(a, b); + let t = compare(main_domain_a, main_domain_b); + + if (t === 0) { + const subdomain_a = subdomainMap.get(a)!; + const subdomain_b = subdomainMap.get(b)!; + t = compare(subdomain_a, subdomain_b); } - return $a.localeCompare($b) || compare(a, b); + if (t === 0 && (a !== main_domain_a || b !== main_domain_b)) { + t = compare(a, b); + } + + return t; }; - sort(inputs, sorter); - - return inputs; + return sort(inputs, sorter); };