|
|
|
import yargs from 'yargs' |
|
import os from 'os' |
|
import path from 'path' |
|
import { fileURLToPath, pathToFileURL } from 'url' |
|
import { createRequire } from 'module' |
|
import fs from 'fs' |
|
import Stream, { Readable } from 'stream' |
|
|
|
|
|
|
|
|
|
|
|
const __filename = function filename(pathURL = import.meta, rmPrefix = os.platform() !== 'win32') { |
|
const path = (pathURL).url || (pathURL) |
|
return rmPrefix ? |
|
/file:\/\/\//.test(path) ? |
|
fileURLToPath(path) : |
|
path : /file:\/\/\//.test(path) ? |
|
path : pathToFileURL(path).href |
|
} |
|
|
|
|
|
const __dirname = function dirname(pathURL) { |
|
const dir = __filename(pathURL, true) |
|
const regex = /\/$/ |
|
return regex.test(dir) ? |
|
dir : fs.existsSync(dir) && |
|
fs.statSync(dir).isDirectory() ? |
|
dir.replace(regex, '') : |
|
path.dirname(dir) |
|
} |
|
|
|
|
|
const __require = function require(dir = import.meta) { |
|
const path = (dir).url || (dir) |
|
return createRequire(path) |
|
} |
|
|
|
const checkFileExists = (file) => fs.promises.access(file, fs.constants.F_OK).then(() => true).catch(() => false) |
|
|
|
|
|
const API = (name, path = '/', query = {}, apikeyqueryname) => (name in global.APIs ? global.APIs[name] : name) + path + (query || apikeyqueryname ? '?' + new URLSearchParams(Object.entries({ ...query, ...(apikeyqueryname ? { [apikeyqueryname]: global.APIKeys[name in global.APIs ? global.APIs[name] : name] } : {}) })) : '') |
|
|
|
const opts = new Object(yargs(process.argv.slice(2)).exitProcess(false).parse()) |
|
const prefix = new RegExp('^[' + (opts['prefix'] || 'xzXZ/i!#$%+£¢€¥^°=¶∆×÷π√✓©®:;?&.\\-').replace(/[|\\{}()[\]^$+*?.\-\^]/g, '\\$&') + ']') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const saveStreamToFile = (stream, file) => new Promise((resolve, reject) => { |
|
const writable = stream.pipe(fs.createWriteStream(file)) |
|
writable.once('finish', () => { |
|
resolve() |
|
writable.destroy() |
|
}) |
|
writable.once('error', () => { |
|
reject() |
|
writable.destroy() |
|
}) |
|
}) |
|
|
|
|
|
const kDestroyed = Symbol('kDestroyed'); |
|
const kIsReadable = Symbol('kIsReadable'); |
|
const isReadableNodeStream = (obj, strict = false) => { |
|
return !!( |
|
obj && |
|
typeof obj.pipe === 'function' && |
|
typeof obj.on === 'function' && |
|
( |
|
!strict || |
|
(typeof obj.pause === 'function' && typeof obj.resume === 'function') |
|
) && |
|
(!obj._writableState || obj._readableState?.readable !== false) && |
|
(!obj._writableState || obj._readableState) |
|
); |
|
} |
|
const isNodeStream = (obj) => { |
|
return ( |
|
obj && |
|
( |
|
obj._readableState || |
|
obj._writableState || |
|
(typeof obj.write === 'function' && typeof obj.on === 'function') || |
|
(typeof obj.pipe === 'function' && typeof obj.on === 'function') |
|
) |
|
); |
|
} |
|
const isDestroyed = (stream) => { |
|
if (!isNodeStream(stream)) return null; |
|
const wState = stream._writableState; |
|
const rState = stream._readableState; |
|
const state = wState || rState; |
|
return !!(stream.destroyed || stream[kDestroyed] || state?.destroyed); |
|
} |
|
const isReadableFinished = (stream, strict) => { |
|
if (!isReadableNodeStream(stream)) return null; |
|
const rState = stream._readableState; |
|
if (rState?.errored) return false; |
|
if (typeof rState?.endEmitted !== 'boolean') return null; |
|
return !!( |
|
rState.endEmitted || |
|
(strict === false && rState.ended === true && rState.length === 0) |
|
); |
|
} |
|
const isReadableStream = (stream) => { |
|
if (typeof Stream.isReadable === 'function') return Stream.isReadable(stream) |
|
if (stream && stream[kIsReadable] != null) return stream[kIsReadable]; |
|
if (typeof stream?.readable !== 'boolean') return null; |
|
if (isDestroyed(stream)) return false; |
|
return ( |
|
isReadableNodeStream(stream) && |
|
!!stream.readable && |
|
!isReadableFinished(stream) |
|
) || stream instanceof fs.ReadStream || stream instanceof Readable; |
|
} |
|
|
|
export default { |
|
__filename, |
|
__dirname, |
|
__require, |
|
checkFileExists, |
|
API, |
|
|
|
saveStreamToFile, |
|
isReadableStream, |
|
|
|
opts, |
|
prefix, |
|
} |