From 2d8a3f7d2e9f8c663b2518bbb2d02fae5f2049d5 Mon Sep 17 00:00:00 2001 From: Andrew Chou Date: Mon, 20 Jul 2026 14:07:40 -0400 Subject: [PATCH 1/6] update downlaod script --- download-libzim.js | 81 +++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 44 deletions(-) diff --git a/download-libzim.js b/download-libzim.js index 788234b..2951d62 100644 --- a/download-libzim.js +++ b/download-libzim.js @@ -1,12 +1,15 @@ -import dotenv from "dotenv"; -dotenv.config(); -import axios from "axios"; -import { mkdirp } from "mkdirp"; -import exec from "exec-then"; -import os from "os"; -import fs from "fs"; +import { basename } from "node:path"; +import { exec } from "node:child_process"; +import { loadEnvFile } from "node:process"; +import { pipeline } from "node:stream/promises"; +import { promisify } from "node:util"; +import { Readable } from "node:stream"; +import fs from "node:fs"; +import os from "node:os"; -mkdirp.sync("./download"); +loadEnvFile(); + +fs.mkdirSync("./download", { recursive: true }); console.info("os.type() is:", os.type()); console.info("os.arch() is:", os.arch()); @@ -39,43 +42,33 @@ if (rawArch !== "x64") { } } -const urls = [ - `https://download.openzim.org/release/libzim/libzim_${osPrefix}-${osArch}-${process.env.LIBZIM_VERSION}.tar.gz`, -].filter((a) => a); +const url = `https://download.openzim.org/release/libzim/libzim_${osPrefix}-${osArch}-${process.env.LIBZIM_VERSION}.tar.gz`; -for (const url of urls) { - console.info(`Downloading Libzim from: `, url); - const filename = new URL(url).pathname.split("/").slice(-1)[0]; - const dlFile = `./download/${filename}`; +console.info(`Downloading Libzim from: `, url); +const filename = basename(new URL(url).pathname); +const dlFile = `./download/${filename}`; - try { - fs.statSync(dlFile); - console.warn(`File [${dlFile}] already exists, not downloading`); - break; - } catch { - // - } +try { + fs.statSync(dlFile); + console.warn(`File [${dlFile}] already exists, not downloading`); +} catch { + // +} + +const response = await fetch(url); + +if (!response.body) { + throw new Error("Response body is missing"); +} + +await pipeline(Readable.fromWeb(response.body), fs.createWriteStream(dlFile)); + +const cmd = `tar --strip-components 1 -xf ${dlFile} -C ./download`; +console.log(`Running Extract:`, `[${cmd}]`); - axios({ - url, - method: "get", - responseType: "stream", - }) - .then(function (response) { - const ws = fs.createWriteStream(dlFile); - return new Promise((resolve, reject) => { - response.data.pipe(ws).on("error", reject).on("close", resolve); - }); - }) - .then(() => { - const cmd = `tar --strip-components 1 -xf ${dlFile} -C ./download`; - console.log(`Running Extract:`, `[${cmd}]`); - return exec(cmd); - }) - .then(() => { - console.info(`Successfully downloaded and extracted file`); - }) - .catch((err) => { - console.error(`Failed to download and extract file:`, err); - }); +try { + await promisify(exec)(cmd); + console.info(`Successfully downloaded and extracted file`); +} catch (err) { + console.error(`Failed to download and extract file:`, err); } From df9ea6516e5eb11b78e7a1018b367bdbf89efb7b Mon Sep 17 00:00:00 2001 From: Andrew Chou Date: Mon, 20 Jul 2026 14:08:08 -0400 Subject: [PATCH 2/6] update bundle script --- bundle-libzim.js | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/bundle-libzim.js b/bundle-libzim.js index f113813..83f7935 100644 --- a/bundle-libzim.js +++ b/bundle-libzim.js @@ -1,10 +1,12 @@ -import dotenv from "dotenv"; -dotenv.config(); -import { mkdirp } from "mkdirp"; -import exec from "exec-then"; -import os from "os"; +import { exec as childProcessExec } from "node:child_process"; +import { loadEnvFile } from "node:process"; +import { promisify } from "node:util"; +import fs from "node:fs"; +import os from "node:os"; -mkdirp.sync("./build/Release"); +loadEnvFile(); + +fs.mkdirSync("./build/Release", { recursive: true }); const isMacOS = os.type() === "Darwin"; const isLinux = os.type() === "Linux"; @@ -15,6 +17,8 @@ if (!isMacOS && !isLinux) { ); } +const exec = promisify(childProcessExec); + if (isLinux) { const rawArch = os.arch(); let libDir; @@ -27,15 +31,15 @@ if (isLinux) { } console.info(`Copying libzim.so.9 from ${libDir} to build folder`); - exec(`cp download/${libDir}/libzim.so.9 build/Release/libzim.so.9`); - exec("ln -sf build/Release/libzim.so.9 build/Release/libzim.so"); // convenience only, not required + await exec(`cp download/${libDir}/libzim.so.9 build/Release/libzim.so.9`); + await exec("ln -sf build/Release/libzim.so.9 build/Release/libzim.so"); // convenience only, not required } if (isMacOS) { console.info("Copying libzim.9.dylib to build folder"); - exec("cp download/lib/libzim.9.dylib build/Release/libzim.9.dylib"); - exec("ln -sf build/Release/libzim.9.dylib build/Release/libzim.dylib"); // convienience only, not required + await exec("cp download/lib/libzim.9.dylib build/Release/libzim.9.dylib"); + await exec("ln -sf build/Release/libzim.9.dylib build/Release/libzim.dylib"); // convienience only, not required console.info("Fixing rpath"); - exec( + await exec( "install_name_tool -change libzim.9.dylib @loader_path/libzim.9.dylib build/Release/zim_binding.node", ); } From 73c30a4f420d4810c25630c23d3cc8542105a1e6 Mon Sep 17 00:00:00 2001 From: Andrew Chou Date: Mon, 20 Jul 2026 14:08:37 -0400 Subject: [PATCH 3/6] update tsconfig --- tsconfig.json | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index b963a0d..9ee7f4c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,24 +1,17 @@ { "compilerOptions": { "module": "es2022", - "lib": [ - "es6" - ], + "lib": ["es2022"], "allowJs": true, + "checkJs": true, "declaration": true, "noImplicitAny": true, "outDir": "dist", "noEmit": true, "removeComments": false, - "target": "es6", + "target": "es2022", "esModuleInterop": true, - "types": [ - "jest", - "node" - ] + "types": ["jest", "node"] }, - "exclude": [ - "dist", - "eslint.config.js" - ] + "exclude": ["dist", "eslint.config.js"] } From e4c1838f0c69c79bb90eb59874dd7733e7bc3b26 Mon Sep 17 00:00:00 2001 From: Andrew Chou Date: Mon, 20 Jul 2026 14:09:13 -0400 Subject: [PATCH 4/6] remove no longer used deps --- package-lock.json | 361 +--------------------------------------------- package.json | 6 +- 2 files changed, 3 insertions(+), 364 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1617b44..a00215f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,7 @@ "@types/bindings": "^1.5.5", "@types/jest": "^30.0.0", "@types/node": "^26.1.1", - "axios": "^1.18.1", "bindings": "^1.5.0", - "dotenv": "^17.4.2", - "exec-then": "^1.3.1", - "mkdirp": "^3.0.1", "node-addon-api": "^8.9.0", "node-gyp": "^13.0.1", "tqdm": "^2.0.3", @@ -2367,18 +2363,6 @@ "node": ">=0.4.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -2531,24 +2515,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", - "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, "node_modules/babel-jest": { "version": "30.4.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.4.1.tgz", @@ -2823,19 +2789,6 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3044,18 +2997,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -3103,6 +3044,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3176,15 +3118,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3205,32 +3138,6 @@ "node": ">=0.3.1" } }, - "node_modules/dotenv": { - "version": "17.4.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", - "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -3288,51 +3195,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -3654,15 +3516,6 @@ "node": ">=0.10.0" } }, - "node_modules/exec-then": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/exec-then/-/exec-then-1.3.1.tgz", - "integrity": "sha512-8N6aNVniIa4xr57wF6tfv8PTqpCnmejQPYLJxj9dGddvbLfFzkkWzMkSE2osmVq2rO6WhGNt9BqkiowkfiJaHw==", - "license": "MIT", - "dependencies": { - "q": "^1.1.2" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -3887,26 +3740,6 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -3924,22 +3757,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -3985,15 +3802,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4014,30 +3822,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -4048,19 +3832,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -4152,18 +3923,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -4201,33 +3960,6 @@ "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -4255,18 +3987,6 @@ "node": ">=8" } }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4274,19 +3994,6 @@ "dev": true, "license": "MIT" }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -5363,15 +5070,6 @@ "tmpl": "1.0.5" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5380,27 +5078,6 @@ "license": "MIT", "peer": true }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -5456,25 +5133,11 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, "node_modules/napi-postinstall": { @@ -6378,15 +6041,6 @@ "node": ">=8" } }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6415,17 +6069,6 @@ "license": "MIT", "peer": true }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/react-is-18": { "name": "react-is", "version": "18.3.1", diff --git a/package.json b/package.json index 0a2efa6..fbb6d64 100644 --- a/package.json +++ b/package.json @@ -47,11 +47,7 @@ "@types/bindings": "^1.5.5", "@types/jest": "^30.0.0", "@types/node": "^26.1.1", - "axios": "^1.18.1", "bindings": "^1.5.0", - "dotenv": "^17.4.2", - "exec-then": "^1.3.1", - "mkdirp": "^3.0.1", "node-addon-api": "^8.9.0", "node-gyp": "^13.0.1", "tqdm": "^2.0.3", @@ -78,4 +74,4 @@ "allowScripts": { "unrs-resolver@1.12.2": true } -} \ No newline at end of file +} From f7fc042eb84e9b3fb68181f1c0628b2786a3f50c Mon Sep 17 00:00:00 2001 From: Andrew Chou Date: Mon, 20 Jul 2026 14:34:14 -0400 Subject: [PATCH 5/6] update paths to be agnostic to cwd --- bundle-libzim.js | 25 +++++++++++++++++++------ download-libzim.js | 20 ++++++++++++-------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/bundle-libzim.js b/bundle-libzim.js index 83f7935..d8b5d2f 100644 --- a/bundle-libzim.js +++ b/bundle-libzim.js @@ -3,10 +3,14 @@ import { loadEnvFile } from "node:process"; import { promisify } from "node:util"; import fs from "node:fs"; import os from "node:os"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; -loadEnvFile(); +const PROJECT_ROOT_DIR = dirname(fileURLToPath(import.meta.url)); -fs.mkdirSync("./build/Release", { recursive: true }); +loadEnvFile(join(PROJECT_ROOT_DIR, ".env")); + +fs.mkdirSync(join(PROJECT_ROOT_DIR, "build", "Release"), { recursive: true }); const isMacOS = os.type() === "Darwin"; const isLinux = os.type() === "Linux"; @@ -31,15 +35,24 @@ if (isLinux) { } console.info(`Copying libzim.so.9 from ${libDir} to build folder`); - await exec(`cp download/${libDir}/libzim.so.9 build/Release/libzim.so.9`); - await exec("ln -sf build/Release/libzim.so.9 build/Release/libzim.so"); // convenience only, not required + await exec(`cp download/${libDir}/libzim.so.9 build/Release/libzim.so.9`, { + cwd: PROJECT_ROOT_DIR, + }); + await exec("ln -sf build/Release/libzim.so.9 build/Release/libzim.so", { + cwd: PROJECT_ROOT_DIR, + }); // convenience only, not required } if (isMacOS) { console.info("Copying libzim.9.dylib to build folder"); - await exec("cp download/lib/libzim.9.dylib build/Release/libzim.9.dylib"); - await exec("ln -sf build/Release/libzim.9.dylib build/Release/libzim.dylib"); // convienience only, not required + await exec("cp download/lib/libzim.9.dylib build/Release/libzim.9.dylib", { + cwd: PROJECT_ROOT_DIR, + }); + await exec("ln -sf build/Release/libzim.9.dylib build/Release/libzim.dylib", { + cwd: PROJECT_ROOT_DIR, + }); // convienience only, not required console.info("Fixing rpath"); await exec( "install_name_tool -change libzim.9.dylib @loader_path/libzim.9.dylib build/Release/zim_binding.node", + { cwd: PROJECT_ROOT_DIR }, ); } diff --git a/download-libzim.js b/download-libzim.js index 2951d62..f94fa36 100644 --- a/download-libzim.js +++ b/download-libzim.js @@ -1,15 +1,19 @@ -import { basename } from "node:path"; import { exec } from "node:child_process"; +import fs from "node:fs"; +import os from "node:os"; +import { basename, dirname, join } from "node:path"; import { loadEnvFile } from "node:process"; +import { Readable } from "node:stream"; import { pipeline } from "node:stream/promises"; +import { fileURLToPath } from "node:url"; import { promisify } from "node:util"; -import { Readable } from "node:stream"; -import fs from "node:fs"; -import os from "node:os"; -loadEnvFile(); +const PROJECT_ROOT_DIR = dirname(fileURLToPath(import.meta.url)); +const DOWNLOAD_DIR = join(PROJECT_ROOT_DIR, "download"); + +loadEnvFile(join(PROJECT_ROOT_DIR, ".env")); -fs.mkdirSync("./download", { recursive: true }); +fs.mkdirSync(DOWNLOAD_DIR, { recursive: true }); console.info("os.type() is:", os.type()); console.info("os.arch() is:", os.arch()); @@ -46,7 +50,7 @@ const url = `https://download.openzim.org/release/libzim/libzim_${osPrefix}-${os console.info(`Downloading Libzim from: `, url); const filename = basename(new URL(url).pathname); -const dlFile = `./download/${filename}`; +const dlFile = join(DOWNLOAD_DIR, filename); try { fs.statSync(dlFile); @@ -63,7 +67,7 @@ if (!response.body) { await pipeline(Readable.fromWeb(response.body), fs.createWriteStream(dlFile)); -const cmd = `tar --strip-components 1 -xf ${dlFile} -C ./download`; +const cmd = `tar --strip-components 1 -xf ${dlFile} -C ${DOWNLOAD_DIR}`; console.log(`Running Extract:`, `[${cmd}]`); try { From 3cec892982566e8c9d52f449d5d2d2863807c943 Mon Sep 17 00:00:00 2001 From: Andrew Chou Date: Tue, 21 Jul 2026 09:50:47 -0400 Subject: [PATCH 6/6] handle non-ok responses from fetch --- download-libzim.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/download-libzim.js b/download-libzim.js index f94fa36..d8532f7 100644 --- a/download-libzim.js +++ b/download-libzim.js @@ -61,6 +61,12 @@ try { const response = await fetch(url); +if (!response.ok) { + throw new Error( + `Fetch returned error response: ${response.status} (${response.statusText})`, + ); +} + if (!response.body) { throw new Error("Response body is missing"); }