graviton-plugin-sdk
Version:
Gravtion plugin Dev Kit
643 lines (625 loc) • 23.5 kB
JavaScript
/*
########################################
MIT License
Copyright (c) 2019 Marc Espin Sanztor
License > https://github.com/Graviton-Code-Editor/Graviton-App/blob/master/LICENSE.md
#########################################
*/
;
module.exports = {
Market: {
open: function(callback) {
/**
* @desc Open the Market window
*/
const market_window = new Window({
id: "market_window",
content: `
<div id=market_loader class="center loading_bar">
<div></div>
<div class=bg></div>
</div>
`
});
market_window.launch();
if (full_plugins.length != 0) {
this.loadMenus();
return callback();
}
this.extensions = [];
const me = this;
const fetch = require("node-fetch");
fetch(
"https://raw.githubusercontent.com/Graviton-Code-Editor/plugins_list/master/list.json"
)
.then(res => res.json())
.then(body => {
me.extensions = body;
plugins_market = me.extensions;
current_plugins = 5;
me.loadMoreExtensions(0, callback);
}).catch(err=>{
me.loadMenus()
return callback(1)
})
},
loadMenus: function() {
/**
* @desc Load the Market page structure
*/
if (document.getElementById("market_window_window") == undefined) return;
graviton.windowContent(
"market_window",
`
<gv-navpanel>
<gv-navbar>
<gv-navtitle>${getTranslation("Market")}</gv-navtitle>
<gv-navbutton href=All default onclick="Market.navigate('all')" >${getTranslation(
"All"
)}</gv-navbutton>
<gv-navbutton href=Themes onclick="Market.navigate('themes');">${getTranslation(
"Themes"
)}</gv-navbutton>
<gv-navbutton href=Installed onclick="Market.navigate('installed');">${getTranslation(
"Installed"
)}</gv-navbutton>
<gv-navbutton href=Settings onclick="Market.navigate('settings')">${getTranslation(
"Settings"
)}</gv-navbutton>
</gv-navbar>
<gv-navcontent id=market_content>
<gv-navpage id=sec_all href=All default></gv-navpage>
<gv-navpage id=sec_installed href=Installed></gv-navpage>
<gv-navpage id="sec_themes" href=Themes></gv-navpage>
<gv-navpage id=sec_settings href=Settings></gv-navpage>
</gv-navcontent>
</gv-navpanel>`
);
elasticContainer.append(document.getElementById("market_content"));
},
clearCache: function() {
/**
* @desc Clear the market cache
*/
const rimraf = require("rimraf");
rimraf.sync(market_file);
full_plugins = [];
current_plugins = 0;
plugins_market = [];
this.extensions = [];
closeWindow("market_window");
},
navigate: function(num, err) {
/**
* @desc Load the market pages
*/
if (document.getElementById("market_window_window") == undefined) return;
switch (num) {
case "all":
if (err == 1) {
document.getElementById("sec_all").innerHTML = getTranslation(
"MarketError1"
);
document.getElementById("sec_themes").innerHTML = getTranslation(
"MarketError1"
);
return;
}
if (err == 2) {
document.getElementById("sec_all").innerHTML = getTranslation(
"MarketError2"
);
document.getElementById("sec_themes").innerHTML = getTranslation(
"MarketError2"
);
return;
}
if (err == 3) {
document.getElementById("sec_all").innerHTML = getTranslation(
"MarketError3"
);
document.getElementById("sec_themes").innerHTML = getTranslation(
"MarketError3"
);
return;
}
if (document.getElementById("sec_all").innerHTML == "") {
document.getElementById("sec_all").innerHTML = `
<div id=loading_exts>Loading extensions...</div>
`;
full_plugins.forEach(_plugin => {
const plugin = graviton.getPlugin(_plugin.package.name);
const data = plugin.repo.git;
const _package = plugin.repo.package;
if (document.getElementById("loading_exts") != undefined) {
document.getElementById("loading_exts").remove();
}
const sec_ID = "sec" + Math.random().toString();
const _new_update =
plugin.local != undefined
? semver.gt(
semver.parse(_package.version),
semver.parse(plugin.local.version)
)
: false;
document.getElementById(
"sec_all"
).innerHTML += graviton.getTemplate(
"market_plugin_card",
`
const sec_ID = "${sec_ID}";
const _package = ${JSON.stringify(_package)};
const _new_update = ${_new_update};
const plugin = ${JSON.stringify(plugin)};
const data = ${JSON.stringify(data)} ;
`
);
});
if (plugins_market.length != full_plugins.length) {
document.getElementById("sec_all").innerHTML += `
<div id=load_more_plugins class="extension_div static" >
<button onclick=" Market.loadMoreExtensions(current_plugins,function(){ document.getElementById('sec_all').innerHTML = ''; Market.navigate('all')}); " class=" center button1 fixed-scale" > Load more</button>
</div>`;
}
}
return;
case "installed":
if (document.getElementById("sec_installed").innerHTML == "") {
document.getElementById("sec_installed").innerHTML = `
<div id=loading_exts2>Loading extensions...</div>
`;
if (plugins_list.length == 0) {
document.getElementById("sec_installed").innerHTML = `
Empty
`;
}
for (const _data of plugins_list) {
if (document.getElementById("loading_exts2") != undefined) {
document.getElementById("loading_exts2").remove();
}
const plugin = graviton.getPlugin(_data.name);
const new_update =
plugin.repo != undefined
? semver.gt(
semver.parse(plugin.repo.package.version),
semver.parse(plugin.local.version)
)
: false;
const sec_ID = "sec" + Math.random().toString();
document.getElementById(
"sec_installed"
).innerHTML += graviton.getTemplate(
"market_plugin_card_installed",
`
const sec_ID = "${sec_ID}";
const _new_update = ${new_update};
const plugin = ${JSON.stringify(plugin)};
`
);
}
}
return;
case "themes":
if (document.getElementById("sec_themes").innerHTML == "") {
document.getElementById("sec_themes").innerHTML = `
<div id=loading_exts3>Loading extensions...</div>`;
for (const _data of full_plugins) {
const plugin = graviton.getPlugin(_data.package.name);
const data = plugin.repo.git;
const _package = plugin.repo.package;
if (_package.colors != undefined) {
if (document.getElementById("loading_exts3") != undefined) {
document.getElementById("loading_exts3").remove();
}
const _new_update =
plugin.local != undefined
? semver.gt(
semver.parse(_package.version).version,
semver.parse(plugin.local.version).version
)
: false;
const sec_ID = "sec" + Math.random().toString();
document.getElementById(
"sec_themes"
).innerHTML += graviton.getTemplate(
"market_plugin_card",
`
const sec_ID = "${sec_ID}";
const _package = ${JSON.stringify(_package)};
const _new_update = ${_new_update};
const plugin = ${JSON.stringify(plugin)};
const data = ${JSON.stringify(data)} ;
`
);
}
}
if (document.getElementById("loading_exts3") != undefined) {
document.getElementById("loading_exts3").remove();
}
if (plugins_market.length != full_plugins.length) {
document.getElementById("sec_themes").innerHTML += `
<div id=load_more_plugins class="extension_div static" >
<button onclick=" Market.loadMoreExtensions(current_plugins,function(){ document.getElementById('sec_themes').innerHTML = ''; Market.navigate('themes')}); " class=" center button1" > Load more</button>
</div>`;
}
}
return;
case "settings":
document.getElementById("sec_settings").innerHTML = `
<h4>${getTranslation("Cache")}</h4>
<div class="section-1">
<button class=button1 onclick='Market.clearCache()'>${getTranslation(
"Clear"
)}</button>
</div>
`;
}
},
loadMoreExtensions(start, callback) {
/**
* @desc Load extensions
*/
let plugins_to_update = false;
const github = require("octonode");
const client = github.client();
const me = this;
if (plugins_market[start] == undefined) {
if (document.getElementById("load_more_plugins") != undefined) {
document.getElementById("load_more_plugins").remove();
}
return;
}
me.extensions = plugins_market.slice(start, start + 5);
current_plugins = start + me.extensions.length;
for (i = 0; i < me.extensions.length; i++) {
const this_i = i;
client.repo(me.extensions[this_i]).info(function(err, data) {
if (err) {
me.loadMenus(); // Maxium calls error, 60calls/hour/ip
return callback(2);
}
const fetch = require("node-fetch");
fetch(
`https://raw.githubusercontent.com/${data.owner.login}/${data.name}/${data.default_branch}/package.json`
)
.then(res => res.json())
.then(_package => {
full_plugins.push({
git: data,
package: _package
});
const plugin = graviton.getPlugin(_package.name);
const _new_update =
plugin.local != undefined
? semver.gt(
semver.parse(_package.version),
semver.parse(plugin.local.version)
)
: false;
if (_new_update) {
plugins_to_update = true;
}
if (err) {
me.loadMenus();
return callback(3);
}
if (start === 0) {
document.getElementById(
"market_loader"
).children[0].style.width = i * 20 + 20 + "%";
}
if (i == current_plugins - 1) {
let date = new Date();
date = Number(
date.getFullYear() +
"" +
date.getMonth() +
"" +
date.getDate()
);
const new_cache = {
date: date,
list: plugins_market,
cache: full_plugins
};
fs.writeFile(market_file, JSON.stringify(new_cache), function(
err
) {
if (err) {
return err;
}
});
me.loadMenus();
if (plugins_to_update) {
new Notification({
title: getTranslation("Market"),
content: getTranslation("ExtUpdateNotification")
});
}
if (callback != undefined) callback();
}
});
});
}
},
openSubExtensions: function(data) {
/**
* @desc Open each's eextension window
*/
const plugin = graviton.getPlugin(data.getAttribute("name"));
if (plugin == undefined) {
new Notification({
title: getTranslation("Market"),
content: getTranslation("ExtCannotLoad")
});
return;
}
const ext_win = new Window({
id: "sec" + data.getAttribute("name"),
content: graviton.getTemplate(
"market_plugin",
`
const name = '${data.getAttribute("name")}';
const update = '${data.getAttribute("update")}';
const plugin = ${JSON.stringify(plugin)};
`
)
});
ext_win.launch();
const bottom_section = document.getElementById(
data.getAttribute("name") + "readme"
);
if (bottom_section != null) {
if (plugin.local != undefined) {
/*
Local Readme
*/
fs.readFile(
path.join(plugins_folder, data.getAttribute("name"), "readme.md"),
"utf8",
function(err, readme) {
const marked = require("marked")
document.getElementById(
data.getAttribute("name") + "readme"
).innerHTML = `<div style="flex:1;" >${
!err ? marked(readme) : getTranslation("NoReadme")
}</div>`;
}
);
/*
Local Screenshots
*/
if (plugin.local.screenshots != undefined) {
plugin.local.screenshots.forEach(sc => {
const screenshoot = document.createElement("img");
screenshoot.setAttribute(
"src",
path.join(plugins_folder, plugin.local.name, sc)
);
screenshoot.style = "height:200px; ";
screenshoot.draggable = false;
document
.getElementById(plugin.local.name + "_screenshots")
.appendChild(screenshoot);
});
}
} else {
/**
* @desc Repository Readme
*/
const fetch = require("node-fetch");
fetch(
`https://raw.githubusercontent.com/${plugin.repo.git.owner.login}/${plugin.repo.git.name}/${plugin.repo.git.default_branch}/readme.md`
)
.then(res => res.text())
.then(body3 => {
if (
document.getElementById(data.getAttribute("name") + "_div") ==
undefined
) {
return;
}
document.getElementById(
data.getAttribute("name") + "readme"
).innerHTML = `<div style="flex:1;" >${
!body3.match("404: Not Found")
? marked(body3)
: getTranslation("NoReadme")
}</div>`;
});
if (plugin.repo.package.screenshots != undefined) {
plugin.repo.package.screenshots.forEach(sc => {
const screenshoot = document.createElement("img");
screenshoot.setAttribute(
"src",
`https://raw.githubusercontent.com/${plugin.repo.git.owner.login}/${plugin.repo.git.name}/${plugin.repo.git.default_branch}/${sc}`
);
screenshoot.style = "height:200px; ";
screenshoot.draggable = false;
document
.getElementById(plugin.repo.package.name + "_screenshots")
.appendChild(screenshoot);
});
}
}
}
},
installExtension: function(name) {
/**
* @desc Install a plugin from the market
* @param {string} name - Name of the plugin
*/
const plugin = graviton.getPlugin(name);
if (fs.existsSync(path.join(plugins_folder, name))) {
new Notification({
title: "Market",
content: name + getTranslation("ExtAlreadyInstalled")
});
return;
}
(() => {
const content = document.getElementById(`${name}_div`);
content.innerHTML += `
<gv-process id="plugin_process${name}" style="width:100%" value="0">
<gv-process-bar></gv-process-bar>
<gv-process-text>Retrieving package information...</gv-process-text>
</gv-process>
`;
})();
const processLoader = document.getElementById(`plugin_process${name}`);
const degit = require("degit");
const emitter = degit(plugin.repo.git.full_name);
processLoader.setValue("15");
processLoader.setText(getTranslation("Process.DownloadingSource"));
emitter.on("info", info => {});
emitter
.clone(path.join(plugins_folder.replace(/\\/g, "\\\\"), name))
.then(() => {
processLoader.setValue("45");
processLoader.setText(getTranslation("Process.DownloadingSource"));
if (plugin.repo.package["dependencies"] != undefined) {
processLoader.setValue("75");
processLoader.setText(
getTranslation("Process.CheckingDependencies")
);
Plugins.installDependencies(plugin.repo.package, () => {
processLoader.setValue("100");
processLoader.setText(
getTranslation("Process.InstallingDependencies")
);
setTimeout(function() {
processLoader.close();
}, 1500);
});
} else {
processLoader.setValue("100");
processLoader.setText(getTranslation("Process.Completed"));
setTimeout(function() {
processLoader.close();
}, 1500);
Plugins.load(plugin.repo.package);
}
const installed_ext_event = new CustomEvent("extension_installed", {
detail: {
name: name
}
});
document.dispatchEvent(installed_ext_event);
if (plugin.repo.package.colors != undefined) {
new Notification({
title: "Market",
content: name + getTranslation("ExtInstalled"),
buttons: {
[getTranslation("Select")]: {
click: function() {
graviton.setTheme(name);
graviton.saveConfiguration();
}
}
}
});
} else {
new Notification({
title: "Market",
content: name + getTranslation("ExtInstalled")
});
}
});
},
updateExtension: function(name) {
/**
* @desc Update a plugin from the market
* @param {string} name - Name of the plugin
*/
const plugin = graviton.getPlugin(name);
const new_update =
plugin.local != undefined && plugin.repo != undefined
? semver.gt(
semver.parse(plugin.repo.package.version).version,
semver.parse(plugin.local.version).version
)
: false;
if (plugin.repo == undefined) {
new Notification({
title: "Market",
content: name + getTranslation("ExtNotListed")
});
return;
}
if (!fs.existsSync(path.join(plugins_folder, name))) {
new Notification({
title: "Market",
content: name + getTranslation("ExtNotInstalled")
});
return;
}
if (!new_update) {
new Notification({
title: "Market",
content: `${getTranslation("ExtNoUpdate") + name}.`
});
return;
}
const rimraf = require("rimraf");
rimraf.sync(path.join(plugins_folder, name));
const degit = require("degit");
const emitter = degit(plugin.repo.git.full_name);
emitter.on("info", info => {});
emitter
.clone(path.join(plugins_folder.replace(/\\/g, "\\\\"), name))
.then(() => {
const updated_ext_event = new CustomEvent("updated_installed", {
detail: {
name: name
}
});
document.dispatchEvent(updated_ext_event);
new Notification({
title: "Market",
content: name + getTranslation("ExtUpdated")
});
if (plugin.repo.package["dependencies"] != undefined) {
Plugins.installDependencies(plugin.repo.package);
} else {
Plugins.load(plugin.repo.package);
}
});
},
uninstallExtension: function(name) {
/**
* @desc Load a pluign
* @param {string} name - Name of the plugin
*/
const rimraf = require("rimraf");
if (!fs.existsSync(path.join(plugins_folder, name))) {
new Notification({
title: "Market",
content: name + getTranslation("ExtNotInstalled")
});
return;
}
rimraf.sync(path.join(plugins_folder, name));
new Notification({
title: "Market",
content: name + getTranslation("ExtUninstalled")
});
const csss = document.getElementsByClassName(name + "_css");
for (i = 0; i < csss.length; i++) {
csss[i].remove();
i--;
}
for (i = 0; i < plugins_list.length; i++) {
if (plugins_list[i].name == name) {
plugins_list.splice(i, 1);
return;
}
}
const uninstalled_ext_event = new CustomEvent("extension_uninstalled", {
detail: {
name: name
}
});
document.dispatchEvent(uninstalled_ext_event);
}
}
};