From fa145b2218b7ea19e03b9aefe520162bca266d34 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Mon, 25 Mar 2024 17:21:11 -0700 Subject: [PATCH 1/3] Implement `fs.openAsBlob` (#9628) * Implement `fs.openAsBlob` * Use a function --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> --- docs/runtime/nodejs-apis.md | 2 +- src/js/node/fs.js | 37 +++++++++++++++++++------------------ test/js/node/fs/fs.test.ts | 14 +++++++++++++- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/docs/runtime/nodejs-apis.md b/docs/runtime/nodejs-apis.md index 63075409b3..9228644889 100644 --- a/docs/runtime/nodejs-apis.md +++ b/docs/runtime/nodejs-apis.md @@ -56,7 +56,7 @@ Some methods are not optimized yet. ### [`node:fs`](https://nodejs.org/api/fs.html) -🟡 Missing `Dir` `openAsBlob` `opendir` `opendirSync` `statfs` `statfsSync` +🟡 Missing `statfs` `statfsSync`, `opendirSync`. `Dir` is partially implemented. ### [`node:http`](https://nodejs.org/api/http.html) diff --git a/src/js/node/fs.js b/src/js/node/fs.js index caaec55eef..d6033efcf7 100644 --- a/src/js/node/fs.js +++ b/src/js/node/fs.js @@ -95,6 +95,10 @@ class FSWatcher extends EventEmitter { // close(); // } +function openAsBlob(path, options) { + return Promise.$resolve(Bun.file(path, options)); +} + class StatWatcher extends EventEmitter { // _handle: StatWatcherHandle; @@ -326,44 +330,39 @@ var access = function access(...args) { lutimesSync = fs.lutimesSync.bind(fs), rmSync = fs.rmSync.bind(fs), rmdirSync = fs.rmdirSync.bind(fs), - writev = (fd, buffers, position, callback) => { + writev = function writev(fd, buffers, position, callback) { if (typeof position === "function") { callback = position; position = null; } - queueMicrotask(() => { - try { - var written = fs.writevSync(fd, buffers, position); - } catch (e) { - callback(e); - } + if (!$isCallable(callback)) { + throw new TypeError("callback must be a function"); + } - callback(null, written, buffers); - }); + fs.writev(fd, buffers, position).$then(bytesWritten => callback(null, bytesWritten, buffers), callback); }, writevSync = fs.writevSync.bind(fs), - readv = (fd, buffers, position, callback) => { + readv = function readv(fd, buffers, position, callback) { if (typeof position === "function") { callback = position; position = null; } - queueMicrotask(() => { - try { - var written = fs.readvSync(fd, buffers, position); - } catch (e) { - callback(e); - } + if (!$isCallable(callback)) { + throw new TypeError("callback must be a function"); + } - callback(null, written, buffers); - }); + fs.readv(fd, buffers, position).$then(bytesRead => callback(null, bytesRead, buffers), callback); }, readvSync = fs.readvSync.bind(fs), Dirent = fs.Dirent, Stats = fs.Stats, watch = function watch(path, options, listener) { return new FSWatcher(path, options, listener); + }, + opendir = function opendir(...args) { + callbackify(promises.opendir, args); }; // TODO: make symbols a separate export somewhere @@ -1349,6 +1348,8 @@ export default { writevSync, fdatasync, fdatasyncSync, + openAsBlob, + opendir, [Symbol.for("::bunternal::")]: { ReadStreamClass, WriteStreamClass, diff --git a/test/js/node/fs/fs.test.ts b/test/js/node/fs/fs.test.ts index 5045023653..d8bf6b1145 100644 --- a/test/js/node/fs/fs.test.ts +++ b/test/js/node/fs/fs.test.ts @@ -37,6 +37,7 @@ import fs, { readvSync, fstatSync, fdatasyncSync, + openAsBlob, } from "node:fs"; import _promises, { type FileHandle } from "node:fs/promises"; @@ -45,7 +46,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import { ReadStream as ReadStream_, WriteStream as WriteStream_ } from "./export-from.js"; -import { ReadStream as ReadStreamStar_, WriteStream as WriteStreamStar_, fdatasync } from "./export-star-from.js"; +import { Dir, ReadStream as ReadStreamStar_, WriteStream as WriteStreamStar_, fdatasync } from "./export-star-from.js"; import { spawnSync } from "bun"; const Buffer = globalThis.Buffer || Uint8Array; @@ -59,6 +60,10 @@ function mkdirForce(path: string) { if (!existsSync(path)) mkdirSync(path, { recursive: true }); } +it("fs.openAsBlob", async () => { + expect((await openAsBlob(import.meta.path)).size).toBe(statSync(import.meta.path).size); +}); + it("writing to 1, 2 are possible", () => { expect(fs.writeSync(1, Buffer.from("\nhello-stdout-test\n"))).toBe(19); expect(fs.writeSync(2, Buffer.from("\nhello-stderr-test\n"))).toBe(19); @@ -2291,6 +2296,13 @@ describe("fs/promises", () => { it("opendir should have a path property, issue#4995", async () => { expect((await fs.promises.opendir(".")).path).toBe("."); + + const { promise, resolve } = Promise.withResolvers(); + fs.opendir(".", (err, dir) => { + resolve(dir); + }); + + expect((await promise).path).toBe("."); }); }); From 20fce1a1be724b33aed397f877107f829bd5bb25 Mon Sep 17 00:00:00 2001 From: Ashcon Partovi Date: Tue, 26 Mar 2024 10:39:33 -0700 Subject: [PATCH 2/3] Fix `bun install -g` not working on Docker Closes #8753 --- .vscode/settings.json | 21 +++++++++++++-------- dockerhub/alpine/Dockerfile | 3 +++ dockerhub/debian-slim/Dockerfile | 3 +++ dockerhub/debian/Dockerfile | 3 +++ dockerhub/distroless/Dockerfile | 3 +++ 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f830213bb0..af077036c9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -40,7 +40,7 @@ // C++ "lldb.verboseLogging": false, "cmake.configureOnOpen": false, - "C_Cpp.errorSquiggles": "enabled", + "C_Cpp.errorSquiggles": "enabled", "[cpp]": { "editor.defaultFormatter": "xaver.clang-format" }, @@ -55,7 +55,7 @@ "prettier.enable": true, "eslint.workingDirectories": ["${workspaceFolder}/packages/bun-types"], "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[javascriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" @@ -72,12 +72,12 @@ // JSON "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[jsonc]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "esbenp.prettier-vscode" }, - + // Markdown "[markdown]": { "editor.defaultFormatter": "esbenp.prettier-vscode", @@ -94,12 +94,17 @@ // TOML "[toml]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "esbenp.prettier-vscode" }, // YAML "[yaml]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + + // Dockerfile + "[dockerfile]": { + "editor.formatOnSave": false }, // Files @@ -148,5 +153,5 @@ "WebKit/WebDriver": true, "WebKit/WebKitBuild": true, "WebKit/WebInspectorUI": true - }, + } } diff --git a/dockerhub/alpine/Dockerfile b/dockerhub/alpine/Dockerfile index 4051cf17d9..79e10e2841 100644 --- a/dockerhub/alpine/Dockerfile +++ b/dockerhub/alpine/Dockerfile @@ -96,6 +96,9 @@ FROM alpine:3.18 ARG BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 ENV BUN_RUNTIME_TRANSPILER_CACHE_PATH=${BUN_RUNTIME_TRANSPILER_CACHE_PATH} +ARG BUN_INSTALL_BIN=/usr/local/bin +ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} + COPY --from=build /usr/local/bin/bun /usr/local/bin/ COPY docker-entrypoint.sh /usr/local/bin/ diff --git a/dockerhub/debian-slim/Dockerfile b/dockerhub/debian-slim/Dockerfile index babe2d7a57..c26352eec5 100644 --- a/dockerhub/debian-slim/Dockerfile +++ b/dockerhub/debian-slim/Dockerfile @@ -62,6 +62,9 @@ FROM debian:bullseye-slim ARG BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 ENV BUN_RUNTIME_TRANSPILER_CACHE_PATH=${BUN_RUNTIME_TRANSPILER_CACHE_PATH} +ARG BUN_INSTALL_BIN=/usr/local/bin +ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} + COPY docker-entrypoint.sh /usr/local/bin COPY --from=build /usr/local/bin/bun /usr/local/bin/bun diff --git a/dockerhub/debian/Dockerfile b/dockerhub/debian/Dockerfile index f8d147cc90..e17da98e21 100644 --- a/dockerhub/debian/Dockerfile +++ b/dockerhub/debian/Dockerfile @@ -63,6 +63,9 @@ COPY --from=build /usr/local/bin/bun /usr/local/bin/bun ARG BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 ENV BUN_RUNTIME_TRANSPILER_CACHE_PATH=${BUN_RUNTIME_TRANSPILER_CACHE_PATH} +ARG BUN_INSTALL_BIN=/usr/local/bin +ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} + RUN groupadd bun \ --gid 1000 \ && useradd bun \ diff --git a/dockerhub/distroless/Dockerfile b/dockerhub/distroless/Dockerfile index adf339bdfe..3ee9cb34f8 100644 --- a/dockerhub/distroless/Dockerfile +++ b/dockerhub/distroless/Dockerfile @@ -62,6 +62,9 @@ FROM gcr.io/distroless/base-nossl-debian11 ARG BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 ENV BUN_RUNTIME_TRANSPILER_CACHE_PATH=${BUN_RUNTIME_TRANSPILER_CACHE_PATH} +ARG BUN_INSTALL_BIN=/usr/local/bin +ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} + COPY --from=build /usr/local/bin/bun /usr/local/bin/ # Temporarily use the `build`-stage image binaries to create a symlink: From 264b4be44a52784f2a43c2d80173bb0ca0325699 Mon Sep 17 00:00:00 2001 From: Ashcon Partovi Date: Tue, 26 Mar 2024 10:41:28 -0700 Subject: [PATCH 3/3] Revert "Fix `bun install -g` not working on Docker" This reverts commit 20fce1a1be724b33aed397f877107f829bd5bb25. --- .vscode/settings.json | 21 ++++++++------------- dockerhub/alpine/Dockerfile | 3 --- dockerhub/debian-slim/Dockerfile | 3 --- dockerhub/debian/Dockerfile | 3 --- dockerhub/distroless/Dockerfile | 3 --- 5 files changed, 8 insertions(+), 25 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index af077036c9..f830213bb0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -40,7 +40,7 @@ // C++ "lldb.verboseLogging": false, "cmake.configureOnOpen": false, - "C_Cpp.errorSquiggles": "enabled", + "C_Cpp.errorSquiggles": "enabled", "[cpp]": { "editor.defaultFormatter": "xaver.clang-format" }, @@ -55,7 +55,7 @@ "prettier.enable": true, "eslint.workingDirectories": ["${workspaceFolder}/packages/bun-types"], "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", }, "[javascriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" @@ -72,12 +72,12 @@ // JSON "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", }, "[jsonc]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", }, - + // Markdown "[markdown]": { "editor.defaultFormatter": "esbenp.prettier-vscode", @@ -94,17 +94,12 @@ // TOML "[toml]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", }, // YAML "[yaml]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - - // Dockerfile - "[dockerfile]": { - "editor.formatOnSave": false + "editor.defaultFormatter": "esbenp.prettier-vscode", }, // Files @@ -153,5 +148,5 @@ "WebKit/WebDriver": true, "WebKit/WebKitBuild": true, "WebKit/WebInspectorUI": true - } + }, } diff --git a/dockerhub/alpine/Dockerfile b/dockerhub/alpine/Dockerfile index 79e10e2841..4051cf17d9 100644 --- a/dockerhub/alpine/Dockerfile +++ b/dockerhub/alpine/Dockerfile @@ -96,9 +96,6 @@ FROM alpine:3.18 ARG BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 ENV BUN_RUNTIME_TRANSPILER_CACHE_PATH=${BUN_RUNTIME_TRANSPILER_CACHE_PATH} -ARG BUN_INSTALL_BIN=/usr/local/bin -ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} - COPY --from=build /usr/local/bin/bun /usr/local/bin/ COPY docker-entrypoint.sh /usr/local/bin/ diff --git a/dockerhub/debian-slim/Dockerfile b/dockerhub/debian-slim/Dockerfile index c26352eec5..babe2d7a57 100644 --- a/dockerhub/debian-slim/Dockerfile +++ b/dockerhub/debian-slim/Dockerfile @@ -62,9 +62,6 @@ FROM debian:bullseye-slim ARG BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 ENV BUN_RUNTIME_TRANSPILER_CACHE_PATH=${BUN_RUNTIME_TRANSPILER_CACHE_PATH} -ARG BUN_INSTALL_BIN=/usr/local/bin -ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} - COPY docker-entrypoint.sh /usr/local/bin COPY --from=build /usr/local/bin/bun /usr/local/bin/bun diff --git a/dockerhub/debian/Dockerfile b/dockerhub/debian/Dockerfile index e17da98e21..f8d147cc90 100644 --- a/dockerhub/debian/Dockerfile +++ b/dockerhub/debian/Dockerfile @@ -63,9 +63,6 @@ COPY --from=build /usr/local/bin/bun /usr/local/bin/bun ARG BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 ENV BUN_RUNTIME_TRANSPILER_CACHE_PATH=${BUN_RUNTIME_TRANSPILER_CACHE_PATH} -ARG BUN_INSTALL_BIN=/usr/local/bin -ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} - RUN groupadd bun \ --gid 1000 \ && useradd bun \ diff --git a/dockerhub/distroless/Dockerfile b/dockerhub/distroless/Dockerfile index 3ee9cb34f8..adf339bdfe 100644 --- a/dockerhub/distroless/Dockerfile +++ b/dockerhub/distroless/Dockerfile @@ -62,9 +62,6 @@ FROM gcr.io/distroless/base-nossl-debian11 ARG BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 ENV BUN_RUNTIME_TRANSPILER_CACHE_PATH=${BUN_RUNTIME_TRANSPILER_CACHE_PATH} -ARG BUN_INSTALL_BIN=/usr/local/bin -ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} - COPY --from=build /usr/local/bin/bun /usr/local/bin/ # Temporarily use the `build`-stage image binaries to create a symlink: