UNPKG

graviton-plugin-sdk

Version:

Gravtion plugin Dev Kit

322 lines (317 loc) 11.4 kB
/* ######################################## MIT License Copyright (c) 2019 Marc Espin Sanz License > https://github.com/Graviton-Code-Editor/Graviton-App/blob/master/LICENSE.md ######################################### */ "use strict"; module.exports = { Plugins: { detect: function(call) { const me = this; if (!fs.existsSync(plugins_db)) { //If the plugins_db folder doesn't exist fs.mkdirSync(plugins_db); } if (!fs.existsSync(plugins_folder)) { //If the plugins folder doesn't exist document.getElementById("g_bootanimation").children[0].innerHTML += ` <div> <p>Installing themes...</p> </div>`; fs.mkdirSync(plugins_folder); const github = require("octonode"); const client = github.client(); const request = require("request"); let loaded = 0; let _old_error = false; for (i = 0; i < default_plugins.length; i++) { client.repo(default_plugins[i]).info(function(err, data) { if (_old_error) return; if (err) { new Notification({ title: "Graviton", content: getTranslation("SetupError1") }); _old_error = true; return call != undefined ? call() : ""; } const degit = require("degit"); request( `https://raw.githubusercontent.com/${data.owner.login}/${data.name}/${data.default_branch}/package.json`, function(error, response, body2) { if (err) { new Notification({ title: "Graviton", content: getTranslation("SetupError1") }); return call != undefined ? call() : ""; } const config = JSON.parse(body2); const emitter = degit(data.full_name); emitter.on("info", info => {}); emitter .clone( path.join( plugins_folder.replace(/\\/g, "\\\\"), config.name ) ) .then(() => { me.load(config, function() { loaded++; if (loaded == default_plugins.length) { return call != undefined ? call() : ""; } }); }); } ); }); } } else { let date = new Date(); date = Number( date.getFullYear() + "" + date.getMonth() + "" + date.getDate() ); if (fs.existsSync(market_file)) { fs.readFile(market_file, "utf8", (err, data) => { const market = JSON.parse(data); if (date > market.date) { const rimraf = require("rimraf"); rimraf.sync(market_file); } else { full_plugins = market.cache; plugins_market = market.list; } current_plugins = full_plugins.length; if (!err) return; }); } fs.readdir(plugins_folder, (err, paths) => { let loaded = 0; if (paths.length == 0) { graviton.consoleWarn("No plugins has been detected."); return call != undefined ? call() : ""; } for (i = 0; loaded < paths.length; i++) { const direct = fs.statSync( path.join(plugins_folder, paths[loaded]) ); if ( !fs.existsSync( path.join(plugins_folder, paths[loaded], "package.json") ) ) { loaded++; } if (!direct.isFile()) { try { require(path.join( plugins_folder, paths[loaded], "package.json" )); } catch { if (loaded == paths.length) { return call != undefined ? call() : ""; } } try { require(path.join( plugins_folder, paths[loaded], "package.json" )); } catch { console.warn( "Cannot parse the package of >" + `%c ${paths[loaded]}` + " %c < plugin. \nReport it in: https://github.com/Graviton-Code-Editor/plugins_list/issues", "color:red; font-weight:bold;", "color:normal; font-weight:normal;" ); //Throw warn in case a plugin has an error loaded++; if (loaded == paths.length) { return call != undefined ? call() : ""; } } const config = require(path.join( plugins_folder, paths[loaded], "package.json" )); me.load(config, function() { loaded++; if (loaded == paths.length) { graviton.consoleInfo("All plugins have been loaded."); return call != undefined ? call() : ""; } }); } } }); } }, load: function(config, call) { /** * @desc Load a pluign * @param {object} config - package.json of the plugin * @param {function} call - Function's callback * @return call - Function's callback */ if (config.colors == undefined) { plugins_list.push(config); if (config["main"] != undefined) { if (graviton.isProduction()) { try { require(path.join( plugins_folder, config["name"], config["main"] )); } catch { console.warn( "Cannot load succesfully the plugin >" + `%c ${config.name}` + " %c <. \nReport it in: https://github.com/Graviton-Code-Editor/plugins_list/issues", "color:red; font-weight:bold;", "color:normal; font-weight:normal;" ); //Throw warn in case a plugin has an error return call != undefined ? call() : ""; } } else { require(path.join(plugins_folder, config["name"], config["main"])); } if (config["css"] == undefined) { return call != undefined ? call() : ""; } } if (config["css"] != undefined) { if (config.type == "custom_theme") { themes.push(config); if (current_config.theme != config.name) return call != undefined ? call() : ""; } for (i = 0; i < config["css"].length; i++) { const link = document.createElement("link"); link.setAttribute("rel", "stylesheet"); link.classList = config["name"] + "_css"; link.setAttribute( "href", path.join(plugins_folder, config["name"], config["css"][i]) ), document.body.appendChild(link); if (i == config.css.length - 1) { return call != undefined ? call() : ""; } } return call != undefined ? call() : ""; } } else { themes.push(config); //Push the theme to the array plugins_list.push(config); const highlightLink = document.createElement("link"); highlightLink.setAttribute("rel", "stylesheet"); if (config.highlight == "default" || config.highlight == "LightUI") { highlightLink.setAttribute( "href", path.join("src", "highlightings", config["highlight"] + ".css") ); //Link new themes } document.body.appendChild(highlightLink); return call != undefined ? call() : ""; } }, installDependencies: function(config, call) { /** * @desc Install NodeJS dependencies of the plugin * @param {object} config - Dependencies object of the plugin */ const me = this; const npm = require("npm"); npm.load( { prefix: path.join(plugins_folder, config["name"]) }, function(er) { if (er) return er; for (const depen in config["dependencies"]) { npm.commands.install([depen], function(er, data) { if (er) return er; me.load(config); if (call != undefined) call(); }); } } ); }, disableCSS: function(config) { /** * @desc Disable plugin's CSS * @param {object} config - Package.json's of the plugin */ if (config.css == undefined || config.css.length == 0) return; const csss = document.getElementsByClassName(config.name + "_css"); for (b = 0; b < csss.length; b++) { csss[b].remove(); b--; } }, enableCSS: function(config) { /** * @desc Enable plugin's CSS * @param {object} config - Package.json's of the plugin */ if (config.css == undefined || config.css.length == 0) return; for (b = 0; b < config.css.length; b++) { const cssLink = document.createElement("link"); cssLink.setAttribute("rel", "stylesheet"); cssLink.classList = config["name"] + "_css"; cssLink.setAttribute( "href", path.join(plugins_folder, config["name"], config["css"][b]) ), document.body.appendChild(cssLink); } const highLightLink = document.createElement("link"); highLightLink.setAttribute("rel", "stylesheet"); highLightLink.classList = config["name"] + "_highlight"; highLightLink.setAttribute( "href", path.join(plugins_folder, config["name"], config["highlight"] + ".css") ); //Link new themes document.body.appendChild(highLightLink); }, installFromLocal: () => { dialog.showOpenDialog( { properties: ["openDirectory"] }, selectedFiles => { if (selectedFiles === undefined) return; const folder_name = path .basename(selectedFiles[0]) .split(".") .pop(); fs.copy( selectedFiles[0], path.join(plugins_folder, folder_name), function(err) { if (err) { graviton.throwError( "An error occured while copying the folder." ); return console.error(err); } console.log( "Installed on" + path.join(plugins_folder, folder_name) ); } ); } ); } } };