diff --git a/libraries/deno-commons-mod.ts b/libraries/deno-commons-mod.ts index c9abdf3..3517579 100644 --- a/libraries/deno-commons-mod.ts +++ b/libraries/deno-commons-mod.ts @@ -4,7 +4,7 @@ import {decodeBase64, encodeBase64} from "jsr:@std/encoding/base64"; import {dirname, fromFileUrl} from "https://deno.land/std/path/mod.ts"; import {spawn, SpawnOptionsWithoutStdio} from "node:child_process"; -import { readFile,readFileSync } from 'node:fs'; +import {mkdir, readFile, readFileSync, rm, writeFile} from "node:fs"; // reference: https://docs.deno.com/examples/hex_base64_encoding/ // import { decodeBase64, encodeBase64 } from "jsr:@std/encoding/base64"; @@ -714,12 +714,12 @@ export function getHomeDir(): string | null { export function homeDir(): string | null { // if (Deno.build.os === "windows") { - // const userProfile = Deno.env.get("USERPROFILE"); + // const userProfile = osEnv("USERPROFILE"); // if (userProfile) { // return userProfile; // } - // const homeDrive = Deno.env.get("HOMEDRIVE"); - // const homePath = Deno.env.get("HOMEPATH"); + // const homeDrive = osEnv("HOMEDRIVE"); + // const homePath = osEnv("HOMEPATH"); // if (homeDrive && homePath) { // return homeDrive + homePath; // } @@ -762,15 +762,20 @@ export async function existsPath(path: string): Promise { } return new Promise((resolve) => { fs.stat(path, (err, stats) => { - if (err) { - resolve(false); - } else { - resolve(stats != null); - } + err ? resolve(false) : resolve(stats !== null); }); }); } +function isDenoNotFound(e) { + return e instanceof Error && e.name == "NotFound"; +} + +function isNodeNotFound(e) { + return (e.errno ?? 0 === -2) && e.message && + e.message.includes("no such file or directory"); +} + export async function readFileToString( filename: string, ): Promise { @@ -778,18 +783,18 @@ export async function readFileToString( try { return await Deno.readTextFile(resolveFilename(filename)); } catch (e) { - if (e instanceof Error && e.name == "NotFound") { + if (isDenoNotFound(e)) { return null; } throw e; } } - return Promise((resolve, reject) => { - readFile(resolveFilename(filename), 'utf8', (err, buffer) => { - if (err) { - reject(err); + return new Promise((resolve, reject) => { + readFile(resolveFilename(filename), "utf8", (err, buffer) => { + if (err && isNodeNotFound(err)) { + resolve(null); } else { - resolve(buffer); + err ? reject(err) : resolve(buffer); } }); }); @@ -800,13 +805,20 @@ export function readFileToStringSync(filename: string): string | null { try { return Deno.readTextFileSync(resolveFilename(filename)); } catch (e) { - if (e instanceof Error && e.name == "NotFound") { + if (isDenoNotFound(e)) { return null; } throw e; } } - return readFileSync(resolveFilename(filename), 'utf8'); + try { + return readFileSync(resolveFilename(filename), "utf8"); + } catch (err) { + if (isNodeNotFound(err)) { + return null; + } + throw err; + } } export async function writeStringToFile( @@ -816,14 +828,49 @@ export async function writeStringToFile( const newFilename = resolveFilename(filename); if (data == null) { if (await existsPath(newFilename)) { - await Deno.remove(newFilename); + await removePath(newFilename); } } else { const parentDirname = dirname(newFilename); if (!await existsPath(parentDirname)) { - await Deno.mkdir(parentDirname, { recursive: true }); + await makeDirectory(parentDirname); } - await Deno.writeTextFile(newFilename, data); + if (isDeno()) { + await Deno.writeTextFile(newFilename, data); + } else { + return new Promise((resolve, reject) => { + writeFile(newFilename, data, (err) => { + err ? reject(err) : resolve(); + }); + }); + } + } +} + +export async function removePath(path: string): Promise { + if (isDeno()) { + await Deno.remove(newFilename); + } else { + return new Promise((resolve, reject) => { + rm(path, (err) => { + err ? reject(err) : resolve(); + }); + }); + } +} + +export async function makeDirectory( + directory: string, + recursive?: boolean, +): Promise { + if (isDeno()) { + await Deno.mkdir(parentDirname, { recursive: recursive ?? true }); + } else { + return new Promise((resolve, reject) => { + mkdir(directory, { recursive: recursive ?? true }, (err) => { + err ? reject(err) : resolve(); + }); + }); } } diff --git a/script-meta-v2.json b/script-meta-v2.json index f2b0549..0bc8ead 100644 --- a/script-meta-v2.json +++ b/script-meta-v2.json @@ -259,11 +259,11 @@ "ssh.ts": { "script_name": "ssh.ts", "script_length": 7011, - "script_sha256": "30095c6f3f1ad698a0be6254c564bd6a5a5404ed7ae9eef0c2491c2640770f8a", + "script_sha256": "474b2352fcd97ff4327383125b3a643860ee5f1d6661710ad43827b1b8107ff0", "script_full_url": "https://git.hatter.ink/hatter/ts-scripts/raw/branch/main/single-scripts/ssh.ts", "single_script_file": true, "publish_time": 1768111677531, - "update_time": 1770533214189 + "update_time": 1770819890077 }, "term-color.ts": { "script_name": "term-color.ts", diff --git a/single-scripts/ssh.ts b/single-scripts/ssh.ts index 4aea4ad..670f1d7 100755 --- a/single-scripts/ssh.ts +++ b/single-scripts/ssh.ts @@ -4,7 +4,7 @@ import {parseArgs} from "node:util"; -import {execCommandShell, log, readFileToString, term,} from "https://script.hatter.ink/@32/deno-commons-mod.ts"; +import {execCommandShell, log, readFileToString, term,} from "https://script.hatter.ink/@39/deno-commons-mod.ts"; import JSON5 from "npm:json5"; class SshTsArgs { @@ -216,5 +216,5 @@ async function main() { } await main(); -// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20260208T142616+08:00.MEYCIQDb99eHtM0E2g2/SJc2 -// cLX9TpTZIY6WFl1hR0F9E3RmhwIhAJMoT77cJYjJwvLySwe8QYzGrpWHe4ROBIdRXiQERNMT +// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20260211T222426+08:00.MEQCIBUaOjb8a7K/MhtnyCNB +// nFaiDnFC1XR30+HUCAUsonBmAiAiinGYmYEA20TuGWogH3pSqIH3X1YDH9T7pbV3l1kuHA==