fix(pkg): restore VFS Dirent reads

This commit is contained in:
imccyu committed 2026-09-14 23:10:47 +08:00
1 parent fa7d5519f5
commit 1b56c865fa
2 files changed
+79 -5

No files matched your search

+76 -2
View File
@@ -1,8 +1,82 @@
diff --git a/prelude/sea-bootstrap.bundle.js b/prelude/sea-bootstrap.bundle.js
index ac14980e953134f2285e326a5111cf52de717cf5..6b0c9d5b5063f447cb8aa3e0fc9d342729f29989 100644
index ac14980e953134f2285e326a5111cf52de717cf5..19465f8004dcd7f75bc7459de2055546f232fd23 100644
--- a/prelude/sea-bootstrap.bundle.js
+++ b/prelude/sea-bootstrap.bundle.js
@@ -5560,7 +5560,6 @@ var require_sea_bootstrap_core = __commonJS({
@@ -5356,6 +5356,39 @@ var require_sea_vfs_setup = __commonJS({
}
};
}
+ var DIRENT_UNKNOWN = 0;
+ var DIRENT_FILE = 1;
+ var DIRENT_DIRECTORY = 2;
+ var DIRENT_SYMLINK = 3;
+ var SEADirent = class {
+ constructor(name, type, parentPath) {
+ this.name = name;
+ this.parentPath = parentPath;
+ this.path = parentPath;
+ this._type = type;
+ }
+ isFile() {
+ return this._type === DIRENT_FILE;
+ }
+ isDirectory() {
+ return this._type === DIRENT_DIRECTORY;
+ }
+ isSymbolicLink() {
+ return this._type === DIRENT_SYMLINK;
+ }
+ isBlockDevice() {
+ return false;
+ }
+ isCharacterDevice() {
+ return false;
+ }
+ isFIFO() {
+ return false;
+ }
+ isSocket() {
+ return false;
+ }
+ };
var SEAProvider = class extends MemoryProvider {
constructor(seaManifest) {
super();
@@ -5465,12 +5498,21 @@ var require_sea_vfs_setup = __commonJS({
}
return -2;
}
- readdirSync(dirPath) {
+ readdirSync(dirPath, options) {
perf2.count("readdirSync calls");
var p = this._resolveSymlink(toManifestKey(dirPath));
var entries = this._manifest.directories[p];
- if (entries) return entries.slice();
- return super.readdirSync(p);
+ if (entries) {
+ if (!options || !options.withFileTypes) return entries.slice();
+ var manifest3 = this._manifest;
+ return entries.map(function(name) {
+ var childPath = p === "/" ? "/" + name : p + "/" + name;
+ var meta = manifest3.stats[childPath];
+ var type = manifest3.symlinks[childPath] !== void 0 ? DIRENT_SYMLINK : meta && meta.isDirectory ? DIRENT_DIRECTORY : meta && meta.isFile ? DIRENT_FILE : DIRENT_UNKNOWN;
+ return new SEADirent(name, type, p);
+ });
+ }
+ return super.readdirSync(p, options);
}
existsSync(filePath) {
perf2.count("existsSync calls");
@@ -5542,7 +5584,7 @@ var require_sea_vfs_setup = __commonJS({
var require_worker_bootstrap_string = __commonJS({
"prelude/_worker-bootstrap-string.js"(exports2, module2) {
"use strict";
- module2.exports = '"use strict";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n try {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n } catch (e) {\n throw mod = 0, e;\n }\n};\n\n// prelude/bootstrap-shared.js\nvar require_bootstrap_shared = __commonJS({\n "prelude/bootstrap-shared.js"(exports2, module2) {\n "use strict";\n var childProcess = require("child_process");\n var { createHash } = require("crypto");\n var fs = require("fs");\n var path = require("path");\n var zlib = require("zlib");\n var { homedir } = require("os");\n var COMPRESS_NONE = 0;\n var COMPRESS_GZIP = 1;\n var COMPRESS_BROTLI = 2;\n var COMPRESS_ZSTD = 3;\n function zstdMissingError(symbol) {\n return new Error(\n "pkg: Zstd compression requires Node.js >= 22.15 (runtime missing zlib." + symbol + "). Re-package this binary with pkg >= the version that embeds Node 22.15+, or contact the distributor for a --compress Brotli/GZip build."\n );\n }\n function pickDecompressorSync(compression) {\n switch (compression) {\n case COMPRESS_NONE:\n return null;\n case COMPRESS_GZIP:\n return zlib.gunzipSync;\n case COMPRESS_BROTLI:\n return zlib.brotliDecompressSync;\n case COMPRESS_ZSTD:\n if (typeof zlib.zstdDecompressSync !== "function") {\n throw zstdMissingError("zstdDecompressSync");\n }\n return zlib.zstdDecompressSync;\n default:\n throw new Error(\n "pkg: unknown compression codec id " + compression + " in manifest"\n );\n }\n }\n function pickDecompressorAsync(compression) {\n switch (compression) {\n case COMPRESS_NONE:\n return null;\n case COMPRESS_GZIP:\n return zlib.gunzip;\n case COMPRESS_BROTLI:\n return zlib.brotliDecompress;\n case COMPRESS_ZSTD:\n if (typeof zlib.zstdDecompress !== "function") {\n throw zstdMissingError("zstdDecompress");\n }\n return zlib.zstdDecompress;\n default:\n throw new Error("pkg: unknown compression codec id " + compression);\n }\n }\n function cpRecursive(src, dest) {\n var st = fs.lstatSync(src);\n if (st.isSymbolicLink()) {\n var target = fs.readlinkSync(src);\n try {\n fs.unlinkSync(dest);\n } catch (_) {\n }\n try {\n fs.symlinkSync(target, dest);\n return;\n } catch (e) {\n if (e && (e.code === "EPERM" || e.code === "EACCES")) {\n var resolved = path.isAbsolute(target) ? target : path.join(path.dirname(src), target);\n cpRecursive(resolved, dest);\n return;\n }\n throw e;\n }\n }\n if (st.isDirectory()) {\n fs.mkdirSync(dest, { recursive: true });\n var entries = fs.readdirSync(src);\n for (var i = 0; i < entries.length; i++) {\n cpRecursive(path.join(src, entries[i]), path.join(dest, entries[i]));\n }\n return;\n }\n var srcContent = fs.readFileSync(src);\n if (fs.existsSync(dest)) {\n var destContent = fs.readFileSync(dest);\n var srcHash = createHash("sha256").update(srcContent).digest("hex");\n var destHash = createHash("sha256").update(destContent).digest("hex");\n if (srcHash === destHash) {\n return;\n }\n }\n fs.writeFileSync(dest, srcContent);\n }\n function patchDlopen(insideSnapshot) {\n var ancestor = process.dlopen;\n var PKG_NATIVE_CACHE_BASE = process.env.PKG_NATIVE_CACHE_PATH || path.join(homedir(), ".cache");\n function revertMakingLong(f) {\n if (/^\\\\\\\\\\?\\\\/.test(f)) return f.slice(4);\n return f;\n }\n process.dlopen = function dlopen() {\n var args = Array.prototype.slice.call(arguments);\n var modulePath = revertMakingLong(args[1]);\n var moduleBaseName = path.basename(modulePath);\n var moduleFolder = path.dirname(modulePath);\n if (insideSnapshot(modulePath)) {\n var moduleContent = fs.readFileSync(modulePath);\n var hash = createHash("sha256").update(moduleContent).digest("hex");\n var tmpFolder = path.join(PKG_NATIVE_CACHE_BASE, "pkg", hash);\n fs.mkdirSync(tmpFolder, { recursive: true });\n var parts = moduleFolder.split(path.sep);\n var mIndex = parts.lastIndexOf("node_modules") + 1;\n var newPath;\n if (mIndex > 0) {\n var modulePackagePath = parts.slice(mIndex).join(path.sep);\n var modulePkgFolder = parts.slice(0, mIndex + 1).join(path.sep);\n var destFolder = path.join(tmpFolder, path.basename(modulePkgFolder));\n cpRecursive(modulePkgFolder, dest Line truncated
+ module2.exports = '"use strict";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n try {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n } catch (e) {\n throw mod = 0, e;\n }\n};\n\n// prelude/bootstrap-shared.js\nvar require_bootstrap_shared = __commonJS({\n "prelude/bootstrap-shared.js"(exports2, module2) {\n "use strict";\n var childProcess = require("child_process");\n var { createHash } = require("crypto");\n var fs = require("fs");\n var path = require("path");\n var zlib = require("zlib");\n var { homedir } = require("os");\n var COMPRESS_NONE = 0;\n var COMPRESS_GZIP = 1;\n var COMPRESS_BROTLI = 2;\n var COMPRESS_ZSTD = 3;\n function zstdMissingError(symbol) {\n return new Error(\n "pkg: Zstd compression requires Node.js >= 22.15 (runtime missing zlib." + symbol + "). Re-package this binary with pkg >= the version that embeds Node 22.15+, or contact the distributor for a --compress Brotli/GZip build."\n );\n }\n function pickDecompressorSync(compression) {\n switch (compression) {\n case COMPRESS_NONE:\n return null;\n case COMPRESS_GZIP:\n return zlib.gunzipSync;\n case COMPRESS_BROTLI:\n return zlib.brotliDecompressSync;\n case COMPRESS_ZSTD:\n if (typeof zlib.zstdDecompressSync !== "function") {\n throw zstdMissingError("zstdDecompressSync");\n }\n return zlib.zstdDecompressSync;\n default:\n throw new Error(\n "pkg: unknown compression codec id " + compression + " in manifest"\n );\n }\n }\n function pickDecompressorAsync(compression) {\n switch (compression) {\n case COMPRESS_NONE:\n return null;\n case COMPRESS_GZIP:\n return zlib.gunzip;\n case COMPRESS_BROTLI:\n return zlib.brotliDecompress;\n case COMPRESS_ZSTD:\n if (typeof zlib.zstdDecompress !== "function") {\n throw zstdMissingError("zstdDecompress");\n }\n return zlib.zstdDecompress;\n default:\n throw new Error("pkg: unknown compression codec id " + compression);\n }\n }\n function cpRecursive(src, dest) {\n var st = fs.lstatSync(src);\n if (st.isSymbolicLink()) {\n var target = fs.readlinkSync(src);\n try {\n fs.unlinkSync(dest);\n } catch (_) {\n }\n try {\n fs.symlinkSync(target, dest);\n return;\n } catch (e) {\n if (e && (e.code === "EPERM" || e.code === "EACCES")) {\n var resolved = path.isAbsolute(target) ? target : path.join(path.dirname(src), target);\n cpRecursive(resolved, dest);\n return;\n }\n throw e;\n }\n }\n if (st.isDirectory()) {\n fs.mkdirSync(dest, { recursive: true });\n var entries = fs.readdirSync(src);\n for (var i = 0; i < entries.length; i++) {\n cpRecursive(path.join(src, entries[i]), path.join(dest, entries[i]));\n }\n return;\n }\n var srcContent = fs.readFileSync(src);\n if (fs.existsSync(dest)) {\n var destContent = fs.readFileSync(dest);\n var srcHash = createHash("sha256").update(srcContent).digest("hex");\n var destHash = createHash("sha256").update(destContent).digest("hex");\n if (srcHash === destHash) {\n return;\n }\n }\n fs.writeFileSync(dest, srcContent);\n }\n function patchDlopen(insideSnapshot) {\n var ancestor = process.dlopen;\n var PKG_NATIVE_CACHE_BASE = process.env.PKG_NATIVE_CACHE_PATH || path.join(homedir(), ".cache");\n function revertMakingLong(f) {\n if (/^\\\\\\\\\\?\\\\/.test(f)) return f.slice(4);\n return f;\n }\n process.dlopen = function dlopen() {\n var args = Array.prototype.slice.call(arguments);\n var modulePath = revertMakingLong(args[1]);\n var moduleBaseName = path.basename(modulePath);\n var moduleFolder = path.dirname(modulePath);\n if (insideSnapshot(modulePath)) {\n var moduleContent = fs.readFileSync(modulePath);\n var hash = createHash("sha256").update(moduleContent).digest("hex");\n var tmpFolder = path.join(PKG_NATIVE_CACHE_BASE, "pkg", hash);\n fs.mkdirSync(tmpFolder, { recursive: true });\n var parts = moduleFolder.split(path.sep);\n var mIndex = parts.lastIndexOf("node_modules") + 1;\n var newPath;\n if (mIndex > 0) {\n var modulePackagePath = parts.slice(mIndex).join(path.sep);\n var modulePkgFolder = parts.slice(0, mIndex + 1).join(path.sep);\n var destFolder = path.join(tmpFolder, path.basename(modulePkgFolder));\n cpRecursive(modulePkgFolder, dest Line truncated
}
});
@@ -5560,7 +5602,6 @@ var require_sea_bootstrap_core = __commonJS({
var insideSnapshot = vfs.insideSnapshot;
var SNAPSHOT_PREFIX = vfs.SNAPSHOT_PREFIX;
shared.patchDlopen(insideSnapshot);
+3 -3
View File
@@ -10,7 +10,7 @@ overrides:
patchedDependencies:
'@electron/[email protected]': 280e7b2816caf01423097d24e79107a66afeb563a348630ce9928ae8499a5861
'@yao-pkg/[email protected]': 28edd2180c36691c481522ef81f6f6614505f45e491aad542ac4663d4e6b3ff8
'@yao-pkg/[email protected]': 07f08c630d0d3886d81fd4600116d07e4871ddcd57f92cb22746b6d246cdc337
[email protected]: b40ae545608897914bd25fb009c97eeac478c34e8a910298ddcb01b746534bb0
importers:
@@ -82,7 +82,7 @@ importers:
version: 4.1.8([email protected])
'@yao-pkg/pkg':
specifier: 6.21.0
version: 6.21.0(patch_hash=28edd2180c36691c481522ef81f6f6614505f45e491aad542ac4663d4e6b3ff8)([email protected])
version: 6.21.0(patch_hash=07f08c630d0d3886d81fd4600116d07e4871ddcd57f92cb22746b6d246cdc337)([email protected])
'@yarnpkg/cli-dist':
specifier: 4.17.1
version: 4.17.1
@@ -22393,7 +22393,7 @@ snapshots:
- bare-buffer
- react-native-b4a
'@yao-pkg/[email protected](patch_hash=28edd2180c36691c481522ef81f6f6614505f45e491aad542ac4663d4e6b3ff8)([email protected])':
'@yao-pkg/[email protected](patch_hash=07f08c630d0d3886d81fd4600116d07e4871ddcd57f92cb22746b6d246cdc337)([email protected])':
dependencies:
'@babel/generator': 7.29.7
'@babel/parser': 7.29.7