Skip to content

Commit

Permalink
Optionally depend on node:fs
Browse files Browse the repository at this point in the history
  • Loading branch information
dahlia committed Jul 15, 2024
1 parent 79dd6b6 commit 755ecb3
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 13 deletions.
9 changes: 7 additions & 2 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,13 @@ Version 0.4.2

To be released.

- The npm version of LogTape no more depends on `node:stream/web` module.
This should make it easier to use LogTape on edge functions.
- LogTape now works well on edge functions. [[#5]]

- The npm version of LogTape no more depends on `node:stream/web` module.
- LogTape now works well with JavaScript runtimes that do not support
`node:fs` module.

[#5]: https://github.com/dahlia/logtape/issues/5


Version 0.4.1
Expand Down
3 changes: 3 additions & 0 deletions dnt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ await build({
mappings: {
"./logtape/filesink.jsr.ts": "./logtape/filesink.node.ts",
"./logtape/filesink.deno.ts": "./logtape/filesink.node.ts",
"./logtape/fs.ts": "./logtape/fs.js",
},
shims: {
deno: "dev",
Expand All @@ -42,6 +43,8 @@ await build({
lib: ["ES2021", "DOM"],
},
async postBuild() {
await Deno.copyFile("logtape/fs.mjs", "npm/esm/fs.js");
await Deno.copyFile("logtape/fs.cjs", "npm/script/fs.js");
await Deno.copyFile("LICENSE", "npm/LICENSE");
await Deno.copyFile("README.md", "npm/README.md");
},
Expand Down
29 changes: 18 additions & 11 deletions logtape/filesink.node.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import fs from "node:fs";
// @ts-ignore: a trick to avoid module resolution error on non-Node.js environ
import fsMod from "./fs.ts";
import type fsType from "node:fs";
import { webDriver } from "./filesink.web.ts";
import {
type FileSinkOptions,
Expand All @@ -9,19 +11,24 @@ import {
type Sink,
} from "./sink.ts";

// @ts-ignore: a trick to avoid module resolution error on non-Node.js environ
const fs = fsMod as (typeof fsType | null);

/**
* A Node.js-specific file sink driver.
*/
export const nodeDriver: RotatingFileSinkDriver<number> = {
openSync(path: string) {
return fs.openSync(path, "a");
},
writeSync: fs.writeSync,
flushSync: fs.fsyncSync,
closeSync: fs.closeSync,
statSync: fs.statSync,
renameSync: fs.renameSync,
};
export const nodeDriver: RotatingFileSinkDriver<number | void> = fs == null
? webDriver
: {
openSync(path: string) {
return fs.openSync(path, "a");
},
writeSync: fs.writeSync,
flushSync: fs.fsyncSync,
closeSync: fs.closeSync,
statSync: fs.statSync,
renameSync: fs.renameSync,
};

/**
* Get a file sink.
Expand Down
16 changes: 16 additions & 0 deletions logtape/fs.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
let fs = null;
if (
"process" in globalThis && "versions" in globalThis.process &&
"node" in globalThis.process.versions &&
typeof globalThis.caches === "undefined" &&
typeof globalThis.addEventListener !== "function" ||
"Bun" in globalThis
) {
try {
fs = require("node" + ":fs");
} catch (_) {
fs = null;
}
}

module.exports = fs;
1 change: 1 addition & 0 deletions logtape/fs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "node:fs";
20 changes: 20 additions & 0 deletions logtape/fs.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
let fs = null;
if (
"process" in globalThis && "versions" in globalThis.process &&
"node" in globalThis.process.versions &&
typeof globalThis.caches === "undefined" &&
typeof globalThis.addEventListener !== "function" ||
"Bun" in globalThis
) {
try {
fs = await import("node" + ":fs");
} catch (e) {
if (e instanceof TypeError) {
fs = null;
} else {
throw e;
}
}
}

export default fs;
22 changes: 22 additions & 0 deletions logtape/fs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
let fs = null;
if (
// @ts-ignore: process is a global variable
"process" in globalThis && "versions" in globalThis.process &&
// @ts-ignore: process is a global variable
"node" in globalThis.process.versions &&
typeof globalThis.caches === "undefined" &&
typeof globalThis.addEventListener !== "function" ||
"Bun" in globalThis
) {
try {
fs = await import("node" + ":fs");
} catch (e) {
if (e instanceof TypeError) {
fs = null;
} else {
throw e;
}
}
}

export default fs;

0 comments on commit 755ecb3

Please sign in to comment.