diff --git a/Build/build-apple-cdn.ts b/Build/build-apple-cdn.ts index fc349405..1c4fc82a 100644 --- a/Build/build-apple-cdn.ts +++ b/Build/build-apple-cdn.ts @@ -17,7 +17,7 @@ export const getAppleCdnDomainsPromise = createMemoizedPromise(() => fsFetchCach } )); -export const buildAppleCdn = task(import.meta.path, async (span) => { +export const buildAppleCdn = task(import.meta.main, import.meta.path)(async (span) => { const promise = getAppleCdnDomainsPromise(); const res: string[] = await span.traceChildPromise('get apple cdn domains', promise); @@ -56,7 +56,3 @@ export const buildAppleCdn = task(import.meta.path, async (span) => { ) ]); }); - -if (import.meta.main) { - buildAppleCdn(); -} diff --git a/Build/build-cdn-download-conf.ts b/Build/build-cdn-download-conf.ts index ab42b02e..ee41d696 100644 --- a/Build/build-cdn-download-conf.ts +++ b/Build/build-cdn-download-conf.ts @@ -48,7 +48,7 @@ const getS3OSSDomainsPromise = (async (): Promise> => { return S3OSSDomains; })(); -export const buildCdnDownloadConf = task(import.meta.path, async (span) => { +export const buildCdnDownloadConf = task(import.meta.main, import.meta.path)(async (span) => { const [ S3OSSDomains, @@ -98,7 +98,3 @@ export const buildCdnDownloadConf = task(import.meta.path, async (span) => { ) ]); }); - -if (import.meta.main) { - buildCdnDownloadConf(); -} diff --git a/Build/build-chn-cidr.ts b/Build/build-chn-cidr.ts index 1e2ad46f..22b592ec 100644 --- a/Build/build-chn-cidr.ts +++ b/Build/build-chn-cidr.ts @@ -13,7 +13,7 @@ export const getChnCidrPromise = createMemoizedPromise(async () => { return exclude([...cidr, ...CN_CIDR_NOT_INCLUDED_IN_CHNROUTE], NON_CN_CIDR_INCLUDED_IN_CHNROUTE, true); }); -export const buildChnCidr = task(import.meta.path, async (span) => { +export const buildChnCidr = task(import.meta.main, import.meta.path)(async (span) => { const filteredCidr = await span.traceChildAsync('download chnroutes2', getChnCidrPromise); // Can not use SHARED_DESCRIPTION here as different license @@ -49,7 +49,3 @@ export const buildChnCidr = task(import.meta.path, async (span) => { ) ]); }); - -if (import.meta.main) { - buildChnCidr(); -} diff --git a/Build/build-cloudmounter-rules.ts b/Build/build-cloudmounter-rules.ts index fedc0b49..eed86994 100644 --- a/Build/build-cloudmounter-rules.ts +++ b/Build/build-cloudmounter-rules.ts @@ -7,7 +7,7 @@ import { task } from './trace'; const outputSurgeDir = path.resolve(import.meta.dir, '../List'); const outputClashDir = path.resolve(import.meta.dir, '../Clash'); -export const buildCloudMounterRules = task(import.meta.path, async (span) => { +export const buildCloudMounterRules = task(import.meta.main, import.meta.path)(async (span) => { // AND,((SRC-IP,192.168.1.110), (DOMAIN, example.com)) const results = DOMAINS.flatMap(domain => { @@ -29,7 +29,3 @@ export const buildCloudMounterRules = task(import.meta.path, async (span) => { path.resolve(outputClashDir, 'non_ip', 'cloudmounter.txt') ); }); - -if (import.meta.main) { - buildCloudMounterRules(); -} diff --git a/Build/build-common.ts b/Build/build-common.ts index fe0e5bc2..8f17b237 100644 --- a/Build/build-common.ts +++ b/Build/build-common.ts @@ -19,7 +19,7 @@ const sourceDir = path.resolve(import.meta.dir, '../Source'); const outputSurgeDir = path.resolve(import.meta.dir, '../List'); const outputClashDir = path.resolve(import.meta.dir, '../Clash'); -export const buildCommon = task(import.meta.path, async (span) => { +export const buildCommon = task(import.meta.main, import.meta.path)(async (span) => { const promises: Array> = []; const paths = await new Fdir() @@ -54,10 +54,6 @@ export const buildCommon = task(import.meta.path, async (span) => { return Promise.all(promises); }); -if (import.meta.main) { - buildCommon(); -} - const processFile = (span: Span, sourcePath: string) => { // console.log('Processing', sourcePath); return span.traceChildAsync(`process file: ${sourcePath}`, async () => { diff --git a/Build/build-deprecate-files.ts b/Build/build-deprecate-files.ts index 5a6dd3af..2882c861 100644 --- a/Build/build-deprecate-files.ts +++ b/Build/build-deprecate-files.ts @@ -11,7 +11,7 @@ const DEPRECATED_FILES = [ const outputSurgeDir = path.resolve(import.meta.dir, '../List'); const outputClashDir = path.resolve(import.meta.dir, '../Clash'); -export const buildDeprecateFiles = task(import.meta.path, (span) => span.traceChildAsync('create deprecated files', async (childSpan) => { +export const buildDeprecateFiles = task(import.meta.main, import.meta.path)((span) => span.traceChildAsync('create deprecated files', async (childSpan) => { const promises: Array> = []; for (const [filePath, description] of DEPRECATED_FILES) { @@ -33,7 +33,3 @@ export const buildDeprecateFiles = task(import.meta.path, (span) => span.traceCh return Promise.all(promises); })); - -if (import.meta.main) { - buildDeprecateFiles(); -} diff --git a/Build/build-domestic-ruleset.ts b/Build/build-domestic-ruleset.ts index 9c047a0d..9f68ef1f 100644 --- a/Build/build-domestic-ruleset.ts +++ b/Build/build-domestic-ruleset.ts @@ -20,7 +20,7 @@ export const getDomesticDomainsRulesetPromise = createMemoizedPromise(async () = return results; }); -export const buildDomesticRuleset = task(import.meta.path, async (span) => { +export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(async (span) => { const rulesetDescription = [ ...SHARED_DESCRIPTION, '', @@ -66,7 +66,3 @@ export const buildDomesticRuleset = task(import.meta.path, async (span) => { ) ]); }); - -if (import.meta.main) { - buildDomesticRuleset(); -} diff --git a/Build/build-internal-reverse-chn-cidr.ts b/Build/build-internal-reverse-chn-cidr.ts index 1db2d761..3afcdd9f 100644 --- a/Build/build-internal-reverse-chn-cidr.ts +++ b/Build/build-internal-reverse-chn-cidr.ts @@ -5,7 +5,7 @@ import { exclude, merge } from 'fast-cidr-tools'; import { getChnCidrPromise } from './build-chn-cidr'; import { NON_CN_CIDR_INCLUDED_IN_CHNROUTE, RESERVED_IPV4_CIDR } from './constants/cidr'; -export const buildInternalReverseChnCIDR = task(import.meta.path, async () => { +export const buildInternalReverseChnCIDR = task(import.meta.main, import.meta.path)(async () => { const cidrPromise = getChnCidrPromise(); const peeked = Bun.peek(cidrPromise); const cidr: string[] = peeked === cidrPromise @@ -25,7 +25,3 @@ export const buildInternalReverseChnCIDR = task(import.meta.path, async () => { return Bun.write(path.resolve(import.meta.dir, '../Internal/reversed-chn-cidr.txt'), `${reversedCidr.join('\n')}\n`); }); - -if (import.meta.main) { - buildInternalReverseChnCIDR(); -} diff --git a/Build/build-microsoft-cdn.ts b/Build/build-microsoft-cdn.ts index 78d15861..50a291b1 100644 --- a/Build/build-microsoft-cdn.ts +++ b/Build/build-microsoft-cdn.ts @@ -44,7 +44,7 @@ export const getMicrosoftCdnRulesetPromise = createMemoizedPromise(async () => { .concat(WHITELIST); }); -export const buildMicrosoftCdn = task(import.meta.path, async (span) => { +export const buildMicrosoftCdn = task(import.meta.main, import.meta.path)(async (span) => { const description = [ ...SHARED_DESCRIPTION, '', @@ -67,7 +67,3 @@ export const buildMicrosoftCdn = task(import.meta.path, async (span) => { path.resolve(import.meta.dir, '../Clash/non_ip/microsoft_cdn.txt') ); }); - -if (import.meta.main) { - buildMicrosoftCdn(); -} diff --git a/Build/build-public.ts b/Build/build-public.ts index 9048e446..83dd19eb 100644 --- a/Build/build-public.ts +++ b/Build/build-public.ts @@ -18,7 +18,7 @@ const folderAndFilesToBeDeployed = [ 'LICENSE' ]; -export const buildPublic = task(import.meta.path, async (span) => { +export const buildPublic = task(import.meta.main, import.meta.path)(async (span) => { await span .traceChild('copy public files') .traceAsyncFn(async () => { @@ -45,10 +45,6 @@ export const buildPublic = task(import.meta.path, async (span) => { return Bun.write(path.join(publicPath, 'index.html'), html); }); -if (import.meta.main) { - buildPublic(); -} - const priorityOrder: Record<'default' | string & {}, number> = { domainset: 1, non_ip: 2, diff --git a/Build/build-reject-domainset.ts b/Build/build-reject-domainset.ts index 54cbecf9..d1c23b55 100644 --- a/Build/build-reject-domainset.ts +++ b/Build/build-reject-domainset.ts @@ -22,7 +22,7 @@ import { sort } from './lib/timsort'; const getRejectSukkaConfPromise = readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/domainset/reject_sukka.conf')); -export const buildRejectDomainSet = task(import.meta.path, async (span) => { +export const buildRejectDomainSet = task(import.meta.main, import.meta.path)(async (span) => { /** Whitelists */ const filterRuleWhitelistDomainSets = new Set(PREDEFINED_WHITELIST); @@ -167,7 +167,3 @@ export const buildRejectDomainSet = task(import.meta.path, async (span) => { ) ]); }); - -if (import.meta.main) { - buildRejectDomainSet(); -} diff --git a/Build/build-reject-ip-list.ts b/Build/build-reject-ip-list.ts index e9959762..972c2678 100644 --- a/Build/build-reject-ip-list.ts +++ b/Build/build-reject-ip-list.ts @@ -67,7 +67,7 @@ const getBotNetFilterIPsPromise = fsFetchCache.apply( const localRejectIPSourcesPromise = readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/ip/reject.conf')); -export const buildRejectIPList = task(import.meta.path, async (span) => { +export const buildRejectIPList = task(import.meta.main, import.meta.path)(async (span) => { const result = await localRejectIPSourcesPromise; const bogusNxDomainIPs = await span.traceChildPromise('get bogus nxdomain ips', getBogusNxDomainIPsPromise); @@ -97,7 +97,3 @@ export const buildRejectIPList = task(import.meta.path, async (span) => { path.resolve(import.meta.dir, '../Clash/ip/reject.txt') ); }); - -if (import.meta.main) { - buildRejectIPList(); -} diff --git a/Build/build-sgmodule-always-realip.ts b/Build/build-sgmodule-always-realip.ts index 17decf44..8e4ad7be 100644 --- a/Build/build-sgmodule-always-realip.ts +++ b/Build/build-sgmodule-always-realip.ts @@ -49,7 +49,7 @@ const HOSTNAMES = [ '*.battlenet.com' ] as const; -export const buildAlwaysRealIPModule = task(import.meta.path, async (span) => { +export const buildAlwaysRealIPModule = task(import.meta.main, import.meta.path)(async (span) => { return compareAndWriteFile( span, [ @@ -62,7 +62,3 @@ export const buildAlwaysRealIPModule = task(import.meta.path, async (span) => { path.resolve(import.meta.dir, '../Modules/sukka_common_always_realip.sgmodule') ); }); - -if (import.meta.main) { - buildAlwaysRealIPModule(); -} diff --git a/Build/build-sgmodule-redirect.ts b/Build/build-sgmodule-redirect.ts index 7a422049..c60c3ec4 100644 --- a/Build/build-sgmodule-redirect.ts +++ b/Build/build-sgmodule-redirect.ts @@ -118,7 +118,7 @@ const REDIRECT_FAKEWEBSITES = [ ['zbrushcn.com', 'https://www.maxon.net/en/zbrush'] ] as const; -export const buildRedirectModule = task(import.meta.path, async (span) => { +export const buildRedirectModule = task(import.meta.main, import.meta.path)(async (span) => { const domains = Array.from( new Set( [ @@ -144,7 +144,3 @@ export const buildRedirectModule = task(import.meta.path, async (span) => { path.resolve(import.meta.dir, '../Modules/sukka_url_redirect.sgmodule') ); }); - -if (import.meta.main) { - buildRedirectModule(); -} diff --git a/Build/build-speedtest-domainset.ts b/Build/build-speedtest-domainset.ts index e4a01ac7..1c464f56 100644 --- a/Build/build-speedtest-domainset.ts +++ b/Build/build-speedtest-domainset.ts @@ -93,7 +93,7 @@ const getPreviousSpeedtestDomainsPromise = createMemoizedPromise(async () => { return domains; }); -export const buildSpeedtestDomainSet = task(import.meta.path, async (span) => { +export const buildSpeedtestDomainSet = task(import.meta.main, import.meta.path)(async (span) => { // Predefined domainset /** @type {Set} */ const domains = new Set([ @@ -267,7 +267,3 @@ export const buildSpeedtestDomainSet = task(import.meta.path, async (span) => { path.resolve(import.meta.dir, '../Clash/domainset/speedtest.txt') ); }); - -if (import.meta.main) { - buildSpeedtestDomainSet(); -} diff --git a/Build/build-sspanel-appprofile.ts b/Build/build-sspanel-appprofile.ts index e5b93ddd..7279fd20 100644 --- a/Build/build-sspanel-appprofile.ts +++ b/Build/build-sspanel-appprofile.ts @@ -26,7 +26,7 @@ const removeNoResolved = (line: string) => line.replace(',no-resolve', ''); /** * This only generates a simplified version, for under-used users only. */ -export const buildSSPanelUIMAppProfile = task(import.meta.path, async (span) => { +export const buildSSPanelUIMAppProfile = task(import.meta.main, import.meta.path)(async (span) => { const [ domesticDomains, appleCdnDomains, @@ -115,10 +115,6 @@ export const buildSSPanelUIMAppProfile = task(import.meta.path, async (span) => ); }); -if (import.meta.main) { - buildSSPanelUIMAppProfile(); -} - const isTruthy = (i: T | 0 | '' | false | null | undefined): i is T => !!i; function generateAppProfile( diff --git a/Build/build-stream-service.ts b/Build/build-stream-service.ts index 73dacaa5..b4eff845 100644 --- a/Build/build-stream-service.ts +++ b/Build/build-stream-service.ts @@ -50,7 +50,7 @@ export const createRulesetForStreamService = (span: Span, fileId: string, title: ])); }; -export const buildStreamService = task(import.meta.path, async (span) => { +export const buildStreamService = task(import.meta.main, import.meta.path)(async (span) => { return Promise.all([ createRulesetForStreamService(span, 'stream', 'All', ALL), createRulesetForStreamService(span, 'stream_us', 'North America', NORTH_AMERICA), @@ -63,7 +63,3 @@ export const buildStreamService = task(import.meta.path, async (span) => { // createRulesetForStreamService('stream_south_east_asia', 'South East Asia', SOUTH_EAST_ASIA) ]); }); - -if (import.meta.main) { - buildStreamService(); -} diff --git a/Build/build-telegram-cidr.ts b/Build/build-telegram-cidr.ts index d55162e4..1ac9a5ec 100644 --- a/Build/build-telegram-cidr.ts +++ b/Build/build-telegram-cidr.ts @@ -32,7 +32,7 @@ export const getTelegramCIDRPromise = createMemoizedPromise(async () => { return { date, results }; }); -export const buildTelegramCIDR = task(import.meta.path, async (span) => { +export const buildTelegramCIDR = task(import.meta.main, import.meta.path)(async (span) => { const { date, results } = await span.traceChildAsync('get telegram cidr', getTelegramCIDRPromise); if (results.length === 0) { @@ -56,7 +56,3 @@ export const buildTelegramCIDR = task(import.meta.path, async (span) => { path.resolve(import.meta.dir, '../Clash/ip/telegram.txt') ); }); - -if (import.meta.main) { - buildTelegramCIDR(); -} diff --git a/Build/download-mock-assets.ts b/Build/download-mock-assets.ts index 3711c4f8..c3c803ca 100644 --- a/Build/download-mock-assets.ts +++ b/Build/download-mock-assets.ts @@ -12,12 +12,8 @@ const ASSETS_LIST = { const mockDir = path.resolve(import.meta.dir, '../Mock'); -export const downloadMockAssets = task(import.meta.path, (span) => Promise.all(Object.entries(ASSETS_LIST).map( +export const downloadMockAssets = task(import.meta.main, import.meta.path)((span) => Promise.all(Object.entries(ASSETS_LIST).map( ([filename, url]) => span .traceChild(url) .traceAsyncFn(() => fetchWithRetry(url).then(res => Bun.write(path.join(mockDir, filename), res))) ))); - -if (import.meta.main) { - downloadMockAssets(); -} diff --git a/Build/download-previous-build.ts b/Build/download-previous-build.ts index 5b7a6419..4c878690 100644 --- a/Build/download-previous-build.ts +++ b/Build/download-previous-build.ts @@ -13,7 +13,7 @@ import { Readable } from 'stream'; const IS_READING_BUILD_OUTPUT = 1 << 2; const ALL_FILES_EXISTS = 1 << 3; -export const downloadPreviousBuild = task(import.meta.path, async (span) => { +export const downloadPreviousBuild = task(import.meta.main, import.meta.path)(async (span) => { const buildOutputList: string[] = []; let flag = 1 | ALL_FILES_EXISTS; @@ -91,7 +91,3 @@ export const downloadPreviousBuild = task(import.meta.path, async (span) => { } }); }); - -if (import.meta.main) { - downloadPreviousBuild(); -} diff --git a/Build/trace/index.ts b/Build/trace/index.ts index 4f986d18..6b7d5a5d 100644 --- a/Build/trace/index.ts +++ b/Build/trace/index.ts @@ -30,7 +30,7 @@ export interface Span { readonly traceAsyncFn: (fn: (span: Span) => T | Promise) => Promise, readonly tracePromise: (promise: Promise) => Promise, readonly traceChildSync: (name: string, fn: (span: Span) => T) => T, - readonly traceChildAsync: (name: string, fn: (span: Span) => T | Promise) => Promise, + readonly traceChildAsync: (name: string, fn: (span: Span) => Promise) => Promise, readonly traceChildPromise: (name: string, promise: Promise) => Promise, readonly traceResult: TraceResult } @@ -85,9 +85,7 @@ export const createSpan = (name: string, parentTraceResult?: TraceResult): Span span.stop(); } }, - get traceResult() { - return curTraceResult; - }, + traceResult: curTraceResult, async tracePromise(promise: Promise): Promise { try { return await promise; @@ -95,44 +93,44 @@ export const createSpan = (name: string, parentTraceResult?: TraceResult): Span span.stop(); } }, - traceChildSync(name: string, fn: (span: Span) => T): T { - return traceChild(name).traceSyncFn(fn); - }, - traceChildAsync(name: string, fn: (span: Span) => T | Promise): Promise { - return traceChild(name).traceAsyncFn(fn); - }, - traceChildPromise(name: string, promise: Promise): Promise { - return traceChild(name).tracePromise(promise); - } + traceChildSync: (name: string, fn: (span: Span) => T): T => traceChild(name).traceSyncFn(fn), + traceChildAsync: (name: string, fn: (span: Span) => T | Promise): Promise => traceChild(name).traceAsyncFn(fn), + traceChildPromise: (name: string, promise: Promise): Promise => traceChild(name).tracePromise(promise) }; // eslint-disable-next-line sukka/no-redundant-variable -- self reference return span; }; -export const task = (importMetaPath: string, fn: (span: Span) => T, customname?: string) => { - const taskName = customname ?? path.basename(importMetaPath, path.extname(importMetaPath)); +export const task = (importMetaMain: boolean, importMetaPath: string) => (fn: (span: Span) => Promise, customName?: string) => { + const taskName = customName ?? path.basename(importMetaPath, path.extname(importMetaPath)); + + const dummySpan = createSpan(taskName); + + if (importMetaMain) { + fn(dummySpan); + } + return async (span?: Span) => { if (span) { return span.traceChildAsync(taskName, fn); } - return fn(createSpan(taskName)); + return fn(dummySpan); }; }; -const isSpan = (obj: any): obj is Span => { - return typeof obj === 'object' && obj && spanTag in obj; -}; - -export const universalify = (taskname: string, fn: (this: void, ...args: A) => R) => { - return (...args: A) => { - const lastArg = args[args.length - 1]; - if (isSpan(lastArg)) { - return lastArg.traceChild(taskname).traceSyncFn(() => fn(...args)); - } - return fn(...args); - }; -}; +// const isSpan = (obj: any): obj is Span => { +// return typeof obj === 'object' && obj && spanTag in obj; +// }; +// export const universalify = (taskname: string, fn: (this: void, ...args: A) => R) => { +// return (...args: A) => { +// const lastArg = args[args.length - 1]; +// if (isSpan(lastArg)) { +// return lastArg.traceChild(taskname).traceSyncFn(() => fn(...args)); +// } +// return fn(...args); +// }; +// }; export const printTraceResult = (traceResult: TraceResult = rootTraceResult) => { printStats(traceResult.children); @@ -140,8 +138,7 @@ export const printTraceResult = (traceResult: TraceResult = rootTraceResult) => }; function printTree(initialTree: TraceResult, printNode: (node: TraceResult, branch: string) => string) { - function printBranch(tree: TraceResult, branch: string) { - const isGraphHead = branch.length === 0; + function printBranch(tree: TraceResult, branch: string, isGraphHead: boolean, isChildOfLastBranch: boolean) { const children = tree.children; let branchHead = ''; @@ -159,7 +156,6 @@ function printTree(initialTree: TraceResult, printNode: (node: TraceResult, bran let baseBranch = branch; if (!isGraphHead) { - const isChildOfLastBranch = branch.endsWith('└─'); baseBranch = branch.slice(0, -2) + (isChildOfLastBranch ? ' ' : '│ '); } @@ -167,11 +163,12 @@ function printTree(initialTree: TraceResult, printNode: (node: TraceResult, bran const lastBranch = `${baseBranch}└─`; children.forEach((child, index) => { - printBranch(child, children.length - 1 === index ? lastBranch : nextBranch); + const last = children.length - 1 === index; + printBranch(child, last ? lastBranch : nextBranch, false, last); }); } - printBranch(initialTree, ''); + printBranch(initialTree, '', true, false); } function printStats(stats: TraceResult[]): void { diff --git a/Build/validate-domestic.ts b/Build/validate-domestic.ts index cca03949..feba7ede 100644 --- a/Build/validate-domestic.ts +++ b/Build/validate-domestic.ts @@ -67,7 +67,3 @@ export const parseDomesticList = async () => { console.log(notIncludedDomestic.size, notIncludedDomestic); }; - -if (import.meta.main) { - parseDomesticList(); -} diff --git a/Build/validate-gfwlist.ts b/Build/validate-gfwlist.ts index 431023e4..aa84fba5 100644 --- a/Build/validate-gfwlist.ts +++ b/Build/validate-gfwlist.ts @@ -119,7 +119,3 @@ export const parseGfwList = async () => { top500Gfwed ] as const; }; - -if (import.meta.main) { - parseGfwList(); -}