diff options
author | 2022-07-04 00:16:29 -0700 | |
---|---|---|
committer | 2022-07-04 00:16:29 -0700 | |
commit | 6f7af725ff224397a19048cca5839757335342b6 (patch) | |
tree | e397c1f404b09da94078908003f7b5c1f12a53b2 | |
parent | e553e82acc71849f0ceb5d04b6340303d7d8f6f0 (diff) | |
download | bun-6f7af725ff224397a19048cca5839757335342b6.tar.gz bun-6f7af725ff224397a19048cca5839757335342b6.tar.zst bun-6f7af725ff224397a19048cca5839757335342b6.zip |
Export fs.promises
-rw-r--r-- | src/bun.js/fs.exports.js | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/bun.js/fs.exports.js b/src/bun.js/fs.exports.js index 0680b3568..8eb043f69 100644 --- a/src/bun.js/fs.exports.js +++ b/src/bun.js/fs.exports.js @@ -119,6 +119,39 @@ function callbackify(fsFunction, args) { }); } +// note: this is not quite the same as how node does it +// in some cases, node swaps around arguments or makes small tweaks to the return type +// this is just better than nothing. +function promisify(fsFunction) { + // TODO: remove variadic arguments + // we can use new Function() here instead + // based on fsFucntion.length + var obj = { + [fsFunction.name]: function (resolve, reject, args) { + var result; + try { + result = fsFunction.apply(fs, args); + args = undefined; + } catch (err) { + args = undefined; + reject(err); + return; + } + + resolve(result); + }, + }; + + var func = obj[fsFunction.name]; + + // TODO: consider @createPromiseCapabiilty intrinsic + return (...args) => { + return new Promise((resolve, reject) => { + func(resolve, reject, args); + }); + }; +} + export var accessSync = fs.accessSync.bind(fs); export var appendFileSync = fs.appendFileSync.bind(fs); export var closeSync = fs.closeSync.bind(fs); @@ -157,6 +190,44 @@ export var lutimesSync = fs.lutimesSync.bind(fs); export var createReadStream = fs.createReadStream.bind(fs); export var createWriteStream = fs.createWriteStream.bind(fs); +export var promises = { + access: promisify(fs.accessSync), + appendFile: promisify(fs.appendFileSync), + close: promisify(fs.closeSync), + copyFile: promisify(fs.copyFileSync), + exists: promisify(fs.existsSync), + chown: promisify(fs.chownSync), + chmod: promisify(fs.chmodSync), + fchmod: promisify(fs.fchmodSync), + fchown: promisify(fs.fchownSync), + fstat: promisify(fs.fstatSync), + fsync: promisify(fs.fsyncSync), + ftruncate: promisify(fs.ftruncateSync), + futimes: promisify(fs.futimesSync), + lchmod: promisify(fs.lchmodSync), + lchown: promisify(fs.lchownSync), + link: promisify(fs.linkSync), + lstat: promisify(fs.lstatSync), + mkdir: promisify(fs.mkdirSync), + mkdtemp: promisify(fs.mkdtempSync), + open: promisify(fs.openSync), + read: promisify(fs.readSync), + write: promisify(fs.writeSync), + readdir: promisify(fs.readdirSync), + writeFile: promisify(fs.writeFileSync), + readlink: promisify(fs.readlinkSync), + realpath: promisify(fs.realpathSync), + rename: promisify(fs.renameSync), + stat: promisify(fs.statSync), + symlink: promisify(fs.symlinkSync), + truncate: promisify(fs.truncateSync), + unlink: promisify(fs.unlinkSync), + utimes: promisify(fs.utimesSync), + lutimes: promisify(fs.lutimesSync), +}; + +promises.readFile = promises.readfile = promisify(fs.readFileSync); + // lol realpath.native = realpath; realpathSync.native = realpathSync; @@ -233,4 +304,5 @@ export default { createReadStream, createWriteStream, constants, + promises, }; |