mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-18 02:06:01 +00:00
151 lines
4.6 KiB
JavaScript
151 lines
4.6 KiB
JavaScript
const fs = require('fs-extra');
|
|
const axios = require('axios');
|
|
const path = require('path');
|
|
const { pluginsdir, datadir } = require('../utility/directories');
|
|
const socket = require('../utility/socket');
|
|
const requirePlugin = require('../shell/requirePlugin');
|
|
const downloadPackage = require('../utility/downloadPackage');
|
|
|
|
// async function loadPackageInfo(dir) {
|
|
// const readmeFile = path.join(dir, 'README.md');
|
|
// const packageFile = path.join(dir, 'package.json');
|
|
|
|
// if (!(await fs.exists(packageFile))) {
|
|
// return null;
|
|
// }
|
|
|
|
// let readme = null;
|
|
// let manifest = null;
|
|
// if (await fs.exists(readmeFile)) readme = await fs.readFile(readmeFile, { encoding: 'utf-8' });
|
|
// if (await fs.exists(packageFile)) manifest = JSON.parse(await fs.readFile(packageFile, { encoding: 'utf-8' }));
|
|
// return {
|
|
// readme,
|
|
// manifest,
|
|
// };
|
|
// }
|
|
|
|
const preinstallPlugins = [
|
|
'dbgate-plugin-mssql',
|
|
'dbgate-plugin-mysql',
|
|
'dbgate-plugin-postgres',
|
|
'dbgate-plugin-csv',
|
|
'dbgate-plugin-excel',
|
|
];
|
|
|
|
module.exports = {
|
|
script_meta: 'get',
|
|
async script({ packageName }) {
|
|
const file = path.join(pluginsdir(), packageName, 'dist', 'frontend.js');
|
|
const data = await fs.readFile(file, {
|
|
encoding: 'utf-8',
|
|
});
|
|
return data;
|
|
},
|
|
|
|
search_meta: 'get',
|
|
async search({ filter }) {
|
|
// DOCS: https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#get-v1search
|
|
const resp = await axios.default.get(
|
|
`http://registry.npmjs.com/-/v1/search?text=${encodeURIComponent(filter)}+keywords:dbgateplugin&size=25&from=0`
|
|
);
|
|
const { objects } = resp.data || {};
|
|
return (objects || []).map((x) => x.package);
|
|
},
|
|
|
|
info_meta: 'get',
|
|
async info({ packageName }) {
|
|
try {
|
|
const infoResp = await axios.default.get(`https://registry.npmjs.org/${packageName}`);
|
|
const { latest } = infoResp.data['dist-tags'];
|
|
const manifest = infoResp.data.versions[latest];
|
|
const { readme } = infoResp.data;
|
|
|
|
return {
|
|
readme,
|
|
manifest,
|
|
};
|
|
} catch (err) {
|
|
return {
|
|
state: 'error',
|
|
error: err.message,
|
|
};
|
|
}
|
|
|
|
// const dir = path.join(pluginstmpdir(), packageName);
|
|
// if (!(await fs.exists(dir))) {
|
|
// await downloadPackage(packageName, dir);
|
|
// }
|
|
// return await loadPackageInfo(dir);
|
|
// return await {
|
|
// ...loadPackageInfo(dir),
|
|
// installed: loadPackageInfo(path.join(pluginsdir(), packageName)),
|
|
// };
|
|
},
|
|
|
|
installed_meta: 'get',
|
|
async installed() {
|
|
const files = await fs.readdir(pluginsdir());
|
|
const res = [];
|
|
for (const packageName of files) {
|
|
const manifest = await fs
|
|
.readFile(path.join(pluginsdir(), packageName, 'package.json'))
|
|
.then((x) => JSON.parse(x));
|
|
const readmeFile = path.join(pluginsdir(), packageName, 'README.md');
|
|
if (await fs.exists(readmeFile)) {
|
|
manifest.readme = await fs.readFile(readmeFile, { encoding: 'utf-8' });
|
|
}
|
|
res.push(manifest);
|
|
}
|
|
return res;
|
|
// const res = await Promise.all(
|
|
// files.map((packageName) =>
|
|
// fs.readFile(path.join(pluginsdir(), packageName, 'package.json')).then((x) => JSON.parse(x))
|
|
// )
|
|
// );
|
|
},
|
|
|
|
install_meta: 'post',
|
|
async install({ packageName }) {
|
|
const dir = path.join(pluginsdir(), packageName);
|
|
if (!(await fs.exists(dir))) {
|
|
await downloadPackage(packageName, dir);
|
|
}
|
|
socket.emitChanged(`installed-plugins-changed`);
|
|
},
|
|
|
|
uninstall_meta: 'post',
|
|
async uninstall({ packageName }) {
|
|
const dir = path.join(pluginsdir(), packageName);
|
|
await fs.rmdir(dir, { recursive: true });
|
|
socket.emitChanged(`installed-plugins-changed`);
|
|
this.removedPlugins.push(packageName);
|
|
await fs.writeFile(path.join(datadir(), 'removed-plugins'), this.removedPlugins.join('\n'));
|
|
},
|
|
|
|
command_meta: 'post',
|
|
async command({ packageName, command, args }) {
|
|
const content = requirePlugin(packageName);
|
|
return content.commands[command](args);
|
|
},
|
|
|
|
async _init() {
|
|
const installed = await this.installed();
|
|
try {
|
|
this.removedPlugins = (await fs.readFile(path.join(datadir(), 'removed-plugins'), { encoding: 'utf-8' })).split(
|
|
'\n'
|
|
);
|
|
} catch (err) {
|
|
this.removedPlugins = [];
|
|
}
|
|
for (const packageName of preinstallPlugins) {
|
|
if (this.removedPlugins.includes(packageName)) continue;
|
|
try {
|
|
console.log('Preinstalling plugin', packageName);
|
|
await this.install({ packageName });
|
|
} catch (err) {
|
|
console.error('Error preinstalling plugin', packageName, err);
|
|
}
|
|
}
|
|
},
|
|
};
|