瀏覽代碼

Refactor: drop all `Bun.write` usage

SukkaW 1 年之前
父節點
當前提交
eed0d58697

+ 7 - 1
Build/build-internal-reverse-chn-cidr.ts

@@ -5,6 +5,8 @@ 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';
 
+import fsp from 'fs/promises';
+
 export const buildInternalReverseChnCIDR = task(import.meta.main, import.meta.path)(async () => {
   const cidr = await getChnCidrPromise();
 
@@ -19,5 +21,9 @@ export const buildInternalReverseChnCIDR = task(import.meta.main, import.meta.pa
     )
   );
 
-  return Bun.write(path.resolve(import.meta.dir, '../Internal/reversed-chn-cidr.txt'), `${reversedCidr.join('\n')}\n`);
+  return fsp.writeFile(
+    path.resolve(import.meta.dir, '../Internal/reversed-chn-cidr.txt'),
+    reversedCidr.join('\n') + '\n',
+    { encoding: 'utf-8' }
+  );
 });

+ 3 - 2
Build/build-public.ts

@@ -1,4 +1,5 @@
 import path from 'path';
+import fsp from 'fs/promises';
 import { task } from './trace';
 import { treeDir } from './lib/tree-dir';
 import type { TreeType, TreeTypeArray } from './lib/tree-dir';
@@ -41,7 +42,7 @@ export const buildPublic = task(import.meta.main, import.meta.path)(async (span)
         const src = path.join(rootPath, file);
         const dest = path.join(publicPath, file);
 
-        return Bun.write(dest, Bun.file(src));
+        return fsp.copyFile(src, dest);
       }));
     });
 
@@ -49,7 +50,7 @@ export const buildPublic = task(import.meta.main, import.meta.path)(async (span)
     .traceChild('generate index.html')
     .traceAsyncFn(() => treeDir(publicPath).then(generateHtml));
 
-  return Bun.write(path.join(publicPath, 'index.html'), html);
+  return fsp.writeFile(path.join(publicPath, 'index.html'), html);
 });
 
 const priorityOrder: Record<'default' | string & {}, number> = {

+ 2 - 1
Build/build-sgmodule-always-realip.ts

@@ -1,4 +1,5 @@
 import path from 'path';
+import fsp from 'fs/promises';
 import { task } from './trace';
 import { compareAndWriteFile } from './lib/create-file';
 import { DIRECTS, LANS } from '../Source/non_ip/direct';
@@ -60,7 +61,7 @@ export const buildAlwaysRealIPModule = task(import.meta.main, import.meta.path)(
       ],
       path.resolve(import.meta.dir, '../Modules/sukka_common_always_realip.sgmodule')
     ),
-    Bun.write(
+    fsp.writeFile(
       path.resolve(import.meta.dir, '../Internal/clash_fake_ip_filter.yaml'),
       yaml.stringify(
         {

+ 15 - 1
Build/download-mock-assets.ts

@@ -1,5 +1,8 @@
 import { task } from './trace';
 import path from 'path';
+import fs from 'fs';
+import { Readable } from 'stream';
+import { pipeline } from 'stream/promises';
 import { fetchWithRetry } from './lib/fetch-retry';
 
 const ASSETS_LIST = {
@@ -15,5 +18,16 @@ const mockDir = path.resolve(import.meta.dir, '../Mock');
 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)))
+    .traceAsyncFn(() => fetchWithRetry(url).then(res => {
+      const src = path.join(mockDir, filename);
+      if (!res.body) {
+        throw new Error(`Empty body from ${url}`);
+      }
+
+      const writeStream = fs.createWriteStream(src, { encoding: 'utf-8' });
+      return pipeline(
+        Readable.fromWeb(res.body),
+        writeStream
+      );
+    }))
 )));

+ 4 - 2
Build/lib/create-file.ts

@@ -4,6 +4,8 @@ import { surgeDomainsetToClashDomainset, surgeRulesetToClashClassicalTextRuleset
 import picocolors from 'picocolors';
 import type { Span } from '../trace';
 import path from 'path';
+import fs from 'fs';
+import fsp from 'fs/promises';
 import { sort } from './timsort';
 import { fastStringArrayJoin } from './misc';
 
@@ -13,7 +15,7 @@ export async function compareAndWriteFile(span: Span, linesA: string[], filePath
 
   const linesALen = linesA.length;
 
-  if (!(await file.exists())) {
+  if (!fs.existsSync(filePath)) {
     console.log(`${filePath} does not exists, writing...`);
     isEqual = false;
   } else if (linesALen === 0) {
@@ -70,7 +72,7 @@ export async function compareAndWriteFile(span: Span, linesA: string[], filePath
 
   await span.traceChildAsync(`writing ${filePath}`, async () => {
     // if (linesALen < 10000) {
-    return Bun.write(file, fastStringArrayJoin(linesA, '\n') + '\n');
+    return fsp.writeFile(filePath, fastStringArrayJoin(linesA, '\n') + '\n');
     // }
     // const writer = file.writer();
 

+ 2 - 1
Build/trim-source.ts

@@ -1,4 +1,5 @@
 import path from 'path';
+import fsp from 'fs/promises';
 import { fdir as Fdir } from 'fdir';
 import { readFileByLine } from './lib/fetch-text-by-line';
 
@@ -43,5 +44,5 @@ async function trimFileLines(file: string) {
     result += line.trim() + '\n';
   }
 
-  return Bun.write(file, result);
+  return fsp.writeFile(file, result);
 }