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.
60 lines
1.9 KiB
TypeScript
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,
|
|
};
|