📦 Chore(custom): add prepare scripts and update action

This commit is contained in:
Kuingsmile
2026-01-15 22:15:53 +08:00
parent 235dbee40d
commit 41f8a5dca1
3 changed files with 118 additions and 17 deletions

100
scripts/prepare.js Normal file
View File

@@ -0,0 +1,100 @@
import { execSync } from 'node:child_process'
import fs from 'fs-extra'
import path from 'node:path'
import axios from 'axios'
import AdmZip from 'adm-zip'
const cwd = process.cwd()
let arch = process.arch
const platform = process.platform
const args = process.argv.slice(2)
const params = Object.fromEntries(
args.map(arg => {
const [key, value] = arg.replace(/^--/, '').split('=')
return [key, value || true]
}),
)
const resolve7zip = () =>
resolveResource({
file: '7za.exe',
downloadURL: `https://github.com/develar/7zip-bin/raw/master/win/${arch}/7za.exe`,
})
async function fetchThemes() {
try {
const zipUrl = 'https://github.com/Kuingsmile/piclist-themeHub/releases/download/latest/themes.zip'
const zipData = await axios.get(zipUrl, {
responseType: 'arraybuffer',
headers: { 'Content-Type': 'application/octet-stream' },
})
const zip = new AdmZip(zipData.data)
zip.extractAllTo(path.join(cwd, 'resources', 'theme'), true)
console.log('[INFO]: themes downloaded and extracted')
return true
} catch (e) {
console.log('[WARN]: failed to download themes', e)
return false
}
}
async function downloadFile(url, path) {
const response = await fetch(url, {
method: 'GET',
headers: { 'Content-Type': 'application/octet-stream' },
})
const buffer = await response.arrayBuffer()
fs.writeFileSync(path, new Uint8Array(buffer))
console.log(`[INFO]: download finished "${url}"`)
}
async function resolveResource(binInfo) {
const { file, downloadURL, needExecutable = false } = binInfo
const resDir = path.join(cwd, 'resources')
const targetPath = path.join(resDir, file)
if (fs.existsSync(targetPath)) {
fs.removeSync(targetPath)
}
fs.mkdirSync(resDir, { recursive: true })
await downloadFile(downloadURL, targetPath)
if (needExecutable && platform !== 'win32') {
execSync(`chmod 755 ${targetPath}`)
console.log(`[INFO]: ${file} chmod finished`)
}
console.log(`[INFO]: ${file} finished`)
}
async function main() {
const tasks = []
if (params.type === '7zip' || params.all) {
console.log('[INFO]: Resolving 7zip...')
tasks.push(resolve7zip())
}
if (params.type === 'themes' || params.all) {
console.log('[INFO]: Resolving themes...')
tasks.push(fetchThemes())
}
if (tasks.length === 0) {
console.log('请提供参数,例如: node script.js --type=7zip 或 --all')
return
}
try {
await Promise.all(tasks)
console.log('Selected resources have been resolved.')
} catch (err) {
console.error('Error:', err)
}
}
main()