You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Hydro/hydro/lib/hpm.ts

60 lines
1.9 KiB
TypeScript

/* eslint-disable import/no-dynamic-require */
/* eslint-disable no-await-in-loop */
/* eslint-disable no-eval */
import fs from 'fs';
import os from 'os';
import path from 'path';
import download from './download';
import { folderSize } from '../utils';
const moduleRoots = Array.from(new Set([
path.resolve(process.cwd(), 'node_modules', '@hydrooj'),
path.resolve(__dirname, 'node_modules', '@hydrooj'),
path.resolve(os.tmpdir(), 'hydro', 'module'),
]));
export async function getInstalled() {
const modules = [];
for (const moduleRoot of moduleRoots) {
if (fs.existsSync(moduleRoot)) {
const files = fs.readdirSync(moduleRoot);
for (const file of files) {
const info = path.resolve(moduleRoot, file, 'package.json');
if (fs.existsSync(info)) modules.push(path.resolve(moduleRoot, file));
}
}
}
return modules;
}
export async function getDetail() {
const modules = [];
for (const moduleRoot of moduleRoots) {
if (fs.existsSync(moduleRoot)) {
const files = fs.readdirSync(moduleRoot);
for (const file of files) {
const info = path.resolve(moduleRoot, file, 'package.json');
if (fs.existsSync(info)) {
const i = JSON.parse(fs.readFileSync(info).toString());
const size = folderSize(path.resolve(moduleRoot, file));
modules.push({
id: i.name,
version: i.version,
description: i.description,
size,
});
}
}
}
}
return modules;
}
export function install(url: string, name: string = '') {
return download(url, path.resolve(process.cwd(), `${name || String.random(16)}.hydro`));
}
global.Hydro.lib.hpm = {
getInstalled, getDetail, install,
};