mirror of
https://github.com/CharaChorder/DeviceManager.git
synced 2026-01-18 07:52:50 +00:00
144 lines
3.3 KiB
TypeScript
144 lines
3.3 KiB
TypeScript
import child_process, { ExecOptions } from 'child_process'
|
|
import crypto from 'crypto'
|
|
import fs from 'fs'
|
|
import os from 'os'
|
|
import path from 'path'
|
|
import util from 'util'
|
|
|
|
import { PLUGIN_NAME } from './constant'
|
|
|
|
/**
|
|
* Check if file exists
|
|
*
|
|
* @param filePath file path
|
|
* @returns does the file exist
|
|
*/
|
|
export const exists = async (filePath: string) => {
|
|
try {
|
|
await fs.promises.access(filePath)
|
|
return true
|
|
} catch (error) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
export const mkdir = async (dirname: string) => {
|
|
const isExist = await exists(dirname)
|
|
|
|
if (!isExist) {
|
|
await fs.promises.mkdir(dirname, { recursive: true })
|
|
}
|
|
}
|
|
|
|
export const ensureDirExist = async (filePath: string, strip = false) => {
|
|
const dirname = strip ? path.dirname(filePath) : filePath
|
|
await mkdir(dirname)
|
|
}
|
|
|
|
export const readFile = async (filePath: string) => {
|
|
const isExist = await exists(filePath)
|
|
return isExist ? (await fs.promises.readFile(filePath)).toString() : undefined
|
|
}
|
|
|
|
export const writeFile = async (
|
|
filePath: string,
|
|
data: string | Uint8Array
|
|
) => {
|
|
await ensureDirExist(filePath, true)
|
|
await fs.promises.writeFile(filePath, data)
|
|
await fs.promises.chmod(filePath, 0o777)
|
|
}
|
|
|
|
export const readDir = async (source: string) => {
|
|
return fs.promises.readdir(source)
|
|
}
|
|
|
|
export const copyDir = async (source: string, dest: string) => {
|
|
try {
|
|
await fs.promises.cp(source, dest, {
|
|
recursive: true
|
|
})
|
|
} catch (error: any) {
|
|
// Fails when nodejs version < 16.7.0, ignore?
|
|
console.log(`${PLUGIN_NAME}:`, error)
|
|
}
|
|
}
|
|
|
|
export const exec = async (cmd: string, options?: ExecOptions) => {
|
|
return util.promisify(child_process.exec)(cmd, options)
|
|
}
|
|
|
|
/**
|
|
* http://nodejs.cn/api/os/os_networkinterfaces.html
|
|
*/
|
|
const isIPV4 = (family: string | number) => {
|
|
return family === 'IPv4' || family === 4
|
|
}
|
|
|
|
export const getLocalV4Ips = () => {
|
|
const interfaceDict = os.networkInterfaces()
|
|
const addresses: string[] = []
|
|
for (const key in interfaceDict) {
|
|
const interfaces = interfaceDict[key]
|
|
if (interfaces) {
|
|
for (const item of interfaces) {
|
|
if (isIPV4(item.family)) {
|
|
addresses.push(item.address)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return addresses
|
|
}
|
|
|
|
export const getDefaultHosts = () => {
|
|
return ['localhost', ...getLocalV4Ips()]
|
|
}
|
|
|
|
export const getHash = async (filePath: string) => {
|
|
const content = await readFile(filePath)
|
|
|
|
if (content) {
|
|
const hash = crypto.createHash('sha256')
|
|
hash.update(content)
|
|
return hash.digest('hex')
|
|
}
|
|
|
|
return undefined
|
|
}
|
|
|
|
const isObj = (obj: any) =>
|
|
Object.prototype.toString.call(obj) === '[object Object]'
|
|
|
|
const mergeObj = (target: any, source: any) => {
|
|
if (!(isObj(target) && isObj(source))) {
|
|
return target
|
|
}
|
|
|
|
for (const key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
const targetValue = target[key]
|
|
const sourceValue = source[key]
|
|
|
|
if (isObj(targetValue) && isObj(sourceValue)) {
|
|
mergeObj(targetValue, sourceValue)
|
|
} else {
|
|
target[key] = sourceValue
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export const deepMerge = (target: any, ...source: any[]) => {
|
|
return source.reduce((a, b) => mergeObj(a, b), target)
|
|
}
|
|
|
|
export const prettyLog = (obj?: Record<string, any>) => {
|
|
return JSON.stringify(obj, null, 2)
|
|
}
|
|
|
|
export const escape = (path?: string) => {
|
|
return `"${path}"`
|
|
}
|