plugin fixes

This commit is contained in:
Jan Prochazka
2020-11-27 18:41:23 +01:00
parent 6729317fcb
commit c4ab06a14b
3 changed files with 101 additions and 53 deletions

View File

@@ -6,23 +6,23 @@ const socket = require('../utility/socket');
const requirePlugin = require('../shell/requirePlugin'); const requirePlugin = require('../shell/requirePlugin');
const downloadPackage = require('../utility/downloadPackage'); const downloadPackage = require('../utility/downloadPackage');
async function loadPackageInfo(dir) { // async function loadPackageInfo(dir) {
const readmeFile = path.join(dir, 'README.md'); // const readmeFile = path.join(dir, 'README.md');
const packageFile = path.join(dir, 'package.json'); // const packageFile = path.join(dir, 'package.json');
if (!(await fs.exists(packageFile))) { // if (!(await fs.exists(packageFile))) {
return null; // return null;
} // }
let readme = null; // let readme = null;
let manifest = null; // let manifest = null;
if (await fs.exists(readmeFile)) readme = await fs.readFile(readmeFile, { encoding: 'utf-8' }); // 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' })); // if (await fs.exists(packageFile)) manifest = JSON.parse(await fs.readFile(packageFile, { encoding: 'utf-8' }));
return { // return {
readme, // readme,
manifest, // manifest,
}; // };
} // }
module.exports = { module.exports = {
script_meta: 'get', script_meta: 'get',
@@ -46,11 +46,28 @@ module.exports = {
info_meta: 'get', info_meta: 'get',
async info({ packageName }) { async info({ packageName }) {
const dir = path.join(pluginstmpdir(), packageName); try {
if (!(await fs.exists(dir))) { const infoResp = await axios.default.get(`https://registry.npmjs.org/${packageName}`);
await downloadPackage(packageName, dir); 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,
};
} }
return await loadPackageInfo(dir);
// const dir = path.join(pluginstmpdir(), packageName);
// if (!(await fs.exists(dir))) {
// await downloadPackage(packageName, dir);
// }
// return await loadPackageInfo(dir);
// return await { // return await {
// ...loadPackageInfo(dir), // ...loadPackageInfo(dir),
// installed: loadPackageInfo(path.join(pluginsdir(), packageName)), // installed: loadPackageInfo(path.join(pluginsdir(), packageName)),
@@ -60,11 +77,23 @@ module.exports = {
installed_meta: 'get', installed_meta: 'get',
async installed() { async installed() {
const files = await fs.readdir(pluginsdir()); const files = await fs.readdir(pluginsdir());
return await Promise.all( const res = [];
files.map((packageName) => for (const packageName of files) {
fs.readFile(path.join(pluginsdir(), packageName, 'package.json')).then((x) => JSON.parse(x)) 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', install_meta: 'post',

View File

@@ -2,7 +2,8 @@ import _ from 'lodash';
export function extractPluginIcon(packageManifest) { export function extractPluginIcon(packageManifest) {
const { links } = packageManifest || {}; const { links } = packageManifest || {};
const { repository, homepage } = links || {}; const { repository } = links || {};
const homepage = (links && links.homepage) || packageManifest.homepage;
const tested = repository || homepage || packageManifest.homepage; const tested = repository || homepage || packageManifest.homepage;
if (tested) { if (tested) {

View File

@@ -55,7 +55,7 @@ function Delimiter() {
return <span> | </span>; return <span> | </span>;
} }
export default function PluginTab({ packageName }) { function PluginTabCore({ packageName }) {
const theme = useTheme(); const theme = useTheme();
const installed = useInstalledPlugins(); const installed = useInstalledPlugins();
const info = useFetch({ const info = useFetch({
@@ -63,7 +63,7 @@ export default function PluginTab({ packageName }) {
url: 'plugins/info', url: 'plugins/info',
defaultValue: null, defaultValue: null,
}); });
const { readme, manifest } = info || {}; let { readme, manifest } = info || {};
const handleInstall = async () => { const handleInstall = async () => {
axios.post('plugins/install', { packageName }); axios.post('plugins/install', { packageName });
}; };
@@ -71,34 +71,52 @@ export default function PluginTab({ packageName }) {
axios.post('plugins/uninstall', { packageName }); axios.post('plugins/uninstall', { packageName });
}; };
if (info == null) {
return <LoadingInfo message="Loading extension detail" />;
}
if (manifest == null) {
const installedFound = installed.find((x) => x.name == packageName);
if (installedFound) {
manifest = installedFound;
readme = installedFound.readme;
}
if (manifest == null) {
return null;
}
}
return (
<>
<Header theme={theme}>
<Icon src={extractPluginIcon(manifest)} />
<HeaderBody>
<Title theme={theme}>{packageName}</Title>
<HeaderLine>
<Author>{extractPluginAuthor(manifest)}</Author>
<Delimiter />
<Version>{manifest.version && manifest.version}</Version>
</HeaderLine>
<HeaderLine>
{!installed.find((x) => x.name == packageName) && (
<FormStyledButton type="button" value="Install" onClick={handleInstall} />
)}
{!!installed.find((x) => x.name == packageName) && (
<FormStyledButton type="button" value="Uninstall" onClick={handleUninstall} />
)}
</HeaderLine>
</HeaderBody>
</Header>
<ReactMarkdown>{readme}</ReactMarkdown>
</>
);
}
export default function PluginTab({ packageName }) {
const theme = useTheme();
return ( return (
<WhitePage theme={theme}> <WhitePage theme={theme}>
{info == null || manifest == null ? ( <PluginTabCore packageName={packageName} />
<LoadingInfo message="Loading extension detail" />
) : (
<>
<Header theme={theme}>
<Icon src={extractPluginIcon(manifest)} />
<HeaderBody>
<Title theme={theme}>{packageName}</Title>
<HeaderLine>
<Author>{extractPluginAuthor(manifest)}</Author>
<Delimiter />
<Version>{manifest.version && manifest.version}</Version>
</HeaderLine>
<HeaderLine>
{!installed.find((x) => x.name == packageName) && (
<FormStyledButton type="button" value="Install" onClick={handleInstall} />
)}
{!!installed.find((x) => x.name == packageName) && (
<FormStyledButton type="button" value="Uninstall" onClick={handleUninstall} />
)}
</HeaderLine>
</HeaderBody>
</Header>
<ReactMarkdown>{readme}</ReactMarkdown>
</>
)}
</WhitePage> </WhitePage>
); );
} }