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 f7baedd
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 13 deletions.
7 changes: 5 additions & 2 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ 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.

- 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.


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
8 changes: 8 additions & 0 deletions logtape/fs.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
let fs;
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";
12 changes: 12 additions & 0 deletions logtape/fs.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
let fs;
try {
fs = await import("node:fs");
} catch (e) {
if (e instanceof TypeError) {
fs = null;
} else {
throw e;
}
}

export default fs;
12 changes: 12 additions & 0 deletions logtape/fs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
let fs;
try {
fs = await import("node:fs");
} catch (e) {
if (e instanceof TypeError) {
fs = null;
} else {
throw e;
}
}

export default fs;

0 comments on commit f7baedd

Please sign in to comment.