Commit 36d98eb for mammothjs

commit 36d98ebbd6463899737008eaa5147449c9d8e7f2
Author: Michael Williamson <mike@zwobble.org>
Date:   Wed Sep 16 23:08:58 2026 +0100

    Prefer fs.promises to promisfying fs functions

diff --git a/lib/docx/files.js b/lib/docx/files.js
index 0d1adb9..255cad4 100644
--- a/lib/docx/files.js
+++ b/lib/docx/files.js
@@ -1,10 +1,10 @@
-var fs = require("fs");
 var url = require("url");
 var os = require("os");
 var dirname = require("path").dirname;
 var resolvePath = require("path").resolve;
 var isAbsolutePath = require('path-is-absolute');

+var fs = require("../fs");
 var promises = require("../promises");


@@ -26,7 +26,7 @@ function Files(options) {

     function read(uri, encoding) {
         return resolveUri(uri).then(function(path) {
-            return readFile(path, encoding).catch(function(error) {
+            return fs.readFile(path, encoding).catch(function(error) {
                 var message = "could not open external image: '" + uri + "' (document directory: '" + base + "')\n" + error.message;
                 return promises.reject(new Error(message));
             });
@@ -50,9 +50,6 @@ function Files(options) {
 }


-var readFile = promises.promisify(fs.readFile.bind(fs));
-
-
 function uriToPath(uriString, platform) {
     if (!platform) {
         platform = os.platform();
diff --git a/lib/fs.js b/lib/fs.js
new file mode 100644
index 0000000..5e2e583
--- /dev/null
+++ b/lib/fs.js
@@ -0,0 +1,16 @@
+var fs = require("fs");
+
+var promises = require("./promises");
+
+function readFile(path, options) {
+    return promises.when(fs.promises.readFile(path, options));
+}
+
+function writeFile(path, data, options) {
+    return promises.when(fs.promises.writeFile(path, data, options));
+}
+
+exports.createWriteStream = fs.createWriteStream.bind(fs);
+exports.readFile = readFile;
+exports.readFileSync = fs.readFileSync.bind(fs);
+exports.writeFile = writeFile;
diff --git a/lib/main.js b/lib/main.js
index 54aeebb..9cc8196 100644
--- a/lib/main.js
+++ b/lib/main.js
@@ -1,11 +1,11 @@
 /* global process */

-var fs = require("fs");
 var path = require("path");

 var mammoth = require("./");
-var promises = require("./promises");
+var fs = require("./fs");
 var images = require("./images");
+var promises = require("./promises");

 function main(argv) {
     var docxPath = argv["docx-path"];
@@ -31,7 +31,7 @@ function main(argv) {

                 return element.read().then(function(imageBuffer) {
                     var imagePath = path.join(outputDir, filename);
-                    return promises.nfcall(fs.writeFile, imagePath, imageBuffer);
+                    return fs.writeFile(imagePath, imageBuffer);
                 }).then(function() {
                     return {src: filename};
                 });
@@ -54,7 +54,7 @@ function main(argv) {

 function readStyleMap(styleMapPath) {
     if (styleMapPath) {
-        return promises.nfcall(fs.readFile, styleMapPath, "utf8");
+        return fs.readFile(styleMapPath, "utf8");
     } else {
         return promises.resolve(null);
     }
diff --git a/lib/unzip.js b/lib/unzip.js
index 75f486f..45bd8bc 100644
--- a/lib/unzip.js
+++ b/lib/unzip.js
@@ -1,15 +1,12 @@
-var fs = require("fs");
-
+var fs = require("./fs");
 var promises = require("./promises");
 var zipfile = require("./zipfile");

 exports.openZip = openZip;

-var readFile = promises.promisify(fs.readFile);
-
 function openZip(options) {
     if (options.path) {
-        return readFile(options.path).then(zipfile.openArrayBuffer);
+        return fs.readFile(options.path).then(zipfile.openArrayBuffer);
     } else if (options.buffer) {
         return promises.resolve(zipfile.openArrayBuffer(options.buffer));
     } else if (options.file) {
diff --git a/test/docx/files.tests.js b/test/docx/files.tests.js
index 5ddda4a..91de108 100644
--- a/test/docx/files.tests.js
+++ b/test/docx/files.tests.js
@@ -1,16 +1,13 @@
 var path = require("path");
-var fs = require("fs");
 var assert = require("assert");

-var promises = require("../../lib/promises");
 var Files = require("../../lib/docx/files").Files;
 var uriToPath = require("../../lib/docx/files").uriToPath;
+var fs = require("../../lib/fs");

 var testing = require("../testing");
 var test = require("../test")(module);

-var readFile = promises.promisify(fs.readFile.bind(fs));
-

 test("Files", {
     "when external file access is disabled then reading file raises error": function() {
@@ -24,7 +21,7 @@ test("Files", {
         var filePath = path.resolve(testing.testPath("tiny-picture.png"));
         var files = new Files({externalFileAccess: true});
         return files.read("file:///" + filePath.replace(/^\//, ""), "base64").then(function(contents) {
-            return readFile(filePath, "base64").then(function(expectedContents) {
+            return fs.readFile(filePath, "base64").then(function(expectedContents) {
                 assert.deepEqual(contents, expectedContents);
             });
         });
@@ -37,7 +34,7 @@ test("Files", {
             relativeToFile: testing.testPath("./document.docx")
         });
         return files.read("tiny-picture.png", "base64").then(function(contents) {
-            return readFile(filePath, "base64").then(function(expectedContents) {
+            return fs.readFile(filePath, "base64").then(function(expectedContents) {
                 assert.deepEqual(contents, expectedContents);
             });
         });
diff --git a/test/mammoth.tests.js b/test/mammoth.tests.js
index 038cbdf..0291c6a 100644
--- a/test/mammoth.tests.js
+++ b/test/mammoth.tests.js
@@ -1,10 +1,9 @@
 var assert = require("assert");
 var path = require("path");
-var fs = require("fs");
 var _ = require("underscore");

 var mammoth = require("../");
-var promises = require("../lib/promises");
+var fs = require("../lib/fs");
 var results = require("../lib/results");

 var testing = require("./testing");
@@ -23,7 +22,7 @@ test('should convert docx containing one paragraph to single p element', functio

 test('should convert docx represented by a Buffer', function() {
     var docxPath = path.join(__dirname, "test-data/single-paragraph.docx");
-    return promises.nfcall(fs.readFile, docxPath)
+    return fs.readFile(docxPath)
         .then(function(buffer) {
             return mammoth.convertToHtml({buffer: buffer});
         })
@@ -124,7 +123,7 @@ test('embedded style maps can be disabled', function() {

 test('embedded style map can be written using toBuffer() and then read', function() {
     var docxPath = path.join(__dirname, "test-data/single-paragraph.docx");
-    return promises.nfcall(fs.readFile, docxPath)
+    return fs.readFile(docxPath)
         .then(function(buffer) {
             return mammoth.embedStyleMap({buffer: buffer}, "p => h1");
         })
@@ -141,7 +140,7 @@ test('embedded style map can be written using toBuffer() and then read', functio

 test('embedded style map can be written using toArrayBuffer() and then read', function() {
     var docxPath = path.join(__dirname, "test-data/single-paragraph.docx");
-    return promises.nfcall(fs.readFile, docxPath)
+    return fs.readFile(docxPath)
         .then(function(buffer) {
             return mammoth.embedStyleMap({buffer: buffer}, "p => h1");
         })
@@ -158,7 +157,7 @@ test('embedded style map can be written using toArrayBuffer() and then read', fu

 test('embedded style map can be retrieved', function() {
     var docxPath = path.join(__dirname, "test-data/single-paragraph.docx");
-    return promises.nfcall(fs.readFile, docxPath)
+    return fs.readFile(docxPath)
         .then(function(buffer) {
             return mammoth.embedStyleMap({buffer: buffer}, "p => h1");
         })
@@ -495,7 +494,7 @@ test('extractRawText only retains raw text', function() {

 test('extractRawText can use .docx files represented by a Buffer', function() {
     var docxPath = path.join(__dirname, "test-data/single-paragraph.docx");
-    return promises.nfcall(fs.readFile, docxPath)
+    return fs.readFile(docxPath)
         .then(function(buffer) {
             return mammoth.extractRawText({buffer: buffer});
         })
diff --git a/test/testing.js b/test/testing.js
index 3948556..ef21ba9 100644
--- a/test/testing.js
+++ b/test/testing.js
@@ -1,8 +1,9 @@
 var path = require("path");
-var fs = require("fs");
-var promises = require("../lib/promises");
 var _ = require("underscore");

+var fs = require("../lib/fs");
+var promises = require("../lib/promises");
+
 exports.testPath = testPath;
 exports.testData = testData;
 exports.createFakeDocxFile = createFakeDocxFile;
@@ -15,7 +16,7 @@ function testPath(filename) {

 function testData(testDataPath) {
     var fullPath = testPath(testDataPath);
-    return promises.nfcall(fs.readFile, fullPath, "utf-8");
+    return fs.readFile(fullPath, "utf-8");
 }

 function createFakeDocxFile(files) {
diff --git a/test/unzip.tests.js b/test/unzip.tests.js
index 4e1bd61..f3a0fef 100644
--- a/test/unzip.tests.js
+++ b/test/unzip.tests.js
@@ -1,10 +1,9 @@
-var fs = require("fs");
 var assert = require("assert");
 var path = require("path");

 var test = require("./test")(module);
+var fs = require("../lib/fs");
 var unzip = require("../lib/unzip");
-var promises = require("../lib/promises");

 test("unzip fails if given empty object", function() {
     return unzip.openZip({}).then(function() {
@@ -25,7 +24,7 @@ test("unzip can open local zip file", function() {

 test('unzip can open Buffer', function() {
     var zipPath = path.join(__dirname, "test-data/hello.zip");
-    return promises.nfcall(fs.readFile, zipPath)
+    return fs.readFile(zipPath)
         .then(function(buffer) {
             return unzip.openZip({buffer: buffer});
         })