Files
aklive2d/packages/libs/libs/file.ts

199 lines
4.8 KiB
TypeScript

import fs, { promises as fsP } from 'node:fs'
import path from 'node:path'
import yauzl from 'yauzl-promise'
import yazl from 'yazl'
type ReadOpts = {
encoding?: BufferEncoding
useAsPrefix?: boolean
}
export async function write(
content: string | NodeJS.ArrayBufferView,
filePath: string
) {
mkdir(path.dirname(filePath))
return await fsP.writeFile(filePath, content, { flag: 'w' })
}
export function writeSync(
content: string | NodeJS.ArrayBufferView,
filePath: string
) {
mkdir(path.dirname(filePath))
return fs.writeFileSync(filePath, content, { flag: 'w' })
}
export async function read(
filePath: string,
opts: ReadOpts = { encoding: 'utf8', useAsPrefix: false }
) {
return await fsP.readFile(filePath, { ...opts, flag: 'r' })
}
export function readSync(
filePath: string,
opts: ReadOpts = { encoding: 'utf8', useAsPrefix: false }
) {
const useAsPrefix = opts.useAsPrefix
delete opts.useAsPrefix
if (useAsPrefix) {
const parent = path.dirname(filePath)
const filename = path.parse(filePath).name
const ext = path.parse(filePath).ext
const file = readdirSync(parent).find(
(e) => e.startsWith(filename) && e.endsWith(ext)
)
if (!file) return null
return fs.readFileSync(path.join(parent, file), {
...opts,
flag: 'r',
})
}
if (exists(filePath)) {
return fs.readFileSync(filePath, { ...opts, flag: 'r' })
}
return null
}
export function exists(filePath: string) {
return fs.existsSync(filePath)
}
export function rmdir(dir: string) {
if (exists(dir)) {
fs.rmSync(dir, { recursive: true })
}
}
export function rm(dir: string) {
if (exists(dir)) {
fs.rmSync(dir, { recursive: true })
}
}
export function mkdir(dir: string) {
if (!exists(dir)) {
fs.mkdirSync(dir, { recursive: true })
}
}
export async function copy(
sourcePath: string,
targetPath: string,
mode = fs.constants.COPYFILE_FICLONE
) {
if (!exists(sourcePath)) {
console.warn(`Source file ${sourcePath} does not exist.`)
return
}
mkdir(path.dirname(targetPath))
return await fsP.copyFile(sourcePath, targetPath, mode)
}
export async function copyDir(
sourcePath: string,
targetPath: string,
mode = fs.constants.COPYFILE_FICLONE
) {
if (!exists(sourcePath)) {
console.warn(`Source file ${sourcePath} does not exist.`)
return
}
mkdir(targetPath)
return await fsP.cp(sourcePath, targetPath, { recursive: true, mode })
}
export function appendSync(content: string | Uint8Array, filePath: string) {
return fs.appendFileSync(filePath, content, 'utf8')
}
export function readdirSync(dir: string) {
if (!exists(dir)) {
console.warn(`Source ${dir} does not exist.`)
return []
}
return fs.readdirSync(dir)
}
export function fileTypeSync(dir: string) {
if (!exists(dir)) {
console.warn(`Source ${dir} does not exist.`)
return null
}
return fs.statSync(dir).isDirectory() ? 'dir' : 'file'
}
export const symlink = (source: string, target: string) => {
if (!exists(source)) {
console.warn(`Source ${source} does not exist.`)
return
}
if (exists(target)) {
fs.unlinkSync(target)
}
mkdir(path.dirname(target))
const relative = path.relative(path.dirname(target), source)
fs.symlinkSync(relative, target)
}
export const symlinkAll = (source: string, target: string) => {
const files = readdirSync(source)
files.map((file) => {
symlink(path.join(source, file), path.join(target, file))
})
}
export const mv = (source: string, target: string) => {
if (!exists(source)) {
console.warn(`Source file ${source} does not exist.`)
return
}
if (exists(target)) {
rmdir(target)
}
mkdir(target)
fs.renameSync(source, target)
}
export const cpSync = (
source: string,
target: string,
opts = {
dereference: false,
}
) => {
if (!exists(source)) {
console.warn(`Source file ${source} does not exist.`)
return
}
if (fs.statSync(source).isFile()) {
mkdir(path.dirname(target))
} else {
mkdir(target)
}
fs.cpSync(source, target, {
recursive: true,
dereference: opts.dereference,
})
}
export const relative = (source: string, target: string) => {
if (!exists(source)) {
console.warn(`Source file ${source} does not exist.`)
return
}
return path.relative(source, target)
}
export const size = (source: string) => {
if (!exists(source)) {
console.warn(`Source file ${source} does not exist.`)
return
}
return fs.statSync(source).size
}
export const unzip = yauzl
export const zip = yazl