diff options
author | 1024x2 | 2018-11-01 21:16:16 +0000 |
---|---|---|
committer | 1024x2 | 2018-11-01 21:16:16 +0000 |
commit | a051aace376492a48c10615106dda222a7136300 (patch) | |
tree | 019fa86518eedba4484744493a4bb4067356f2be /src/api.js | |
parent | 583e13ca1fbe80fd0402fa49bcdd8d0e5df3a065 (diff) |
new fancy webpack stuff
Diffstat (limited to 'src/api.js')
-rw-r--r-- | src/api.js | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/src/api.js b/src/api.js new file mode 100644 index 0000000..8acc8e2 --- /dev/null +++ b/src/api.js @@ -0,0 +1,260 @@ +var errbar = "[<span style=\"color:#0f0\"></span><span style=\"color:#555\">---------------------------------------------------</span>] ERR! <span style=\"color:#f00\">!</span>"; +// thanks robbie! sauce: https://gist.github.com/robbie0630/e1386fb10676598e7d60d4f406a41042 +// NOTE: this is a modified version +var _abarpkg93uses = (width, percent) => { + if (percent > 1) percent = 1; + let barwidth = width - 9; + let ticker = "\\"; + switch (Math.floor(percent * 100) % 4) { + case 1: + ticker = "|"; + break; + case 2: + ticker = "/"; + break; + case 3: + ticker = "-"; + break; + default: + ticker = "\\"; + break; + } + ticker = Math.floor(percent) == 1 ? "<span style='color:#0f0'>✔️</span>" : ticker; + let pbar = "[<span style='color:#0f0'>"; + for (let i = 0; i < Math.floor(percent*barwidth); ++i) pbar += "="; + pbar += "</span><span style='color:#555'>"; + for (let i = 0; i < Math.ceil((1-percent)*barwidth); ++i) pbar += "-"; + pbar += "</span>] " + Math.floor(percent * 100) + "% " + ticker.padStart(4 - (percent * 100).toFixed().length); + return pbar; +}; + +var pkg93 = { + getConfig: function() { + try { + return JSON.parse(localStorage[".pkg93/config.json"]); + } catch (err) { + return err; + } + }, + pull: async function(cli) { + cli = cli || {log: (i) => {$log(i);}}; + var config = pkg93.getConfig(); + config.pkglist = []; + return new Promise(async (res, rej) => { + for (let source of config.repos) { + await new Promise(async (reso) => { + try { + cli.log("<b><span style='color:#f0f'>GET</span></b> " + source + "/repo.json"); + var bardiv = cli.log(_abarpkg93uses(60, 0)); + var xhr = new XMLHttpRequest(); + xhr.open("GET", source + "/repo.json", true); + xhr.onprogress = e => { + bardiv.innerHTML = _abarpkg93uses(60, e.loaded / e.total); + }; + xhr.onerror = () => { + bardiv.innerHTML = errbar; + cli.log("<b><span style='color:#f00'>ERR</span></b> Fatal error while retriving package.json."); + if (xhr.status != 0) { + cli.log("<b><span style='color:#f00'>ERR</span></b> " + xhr.status + " " + xhr.statusText); + } + }; + xhr.onload = () => { + try { + var json = JSON.parse(xhr.responseText); + cli.log("<b><span style='color:#0f0'>NAME</span></b> " + json.name); + cli.log("<b><span style='color:#0f0'>MSG</span></b> " + json.msg); + for (let item of json.packages) { + try { + config.pkglist.push(item + "@" + source); + cli.log("<b><span style='color:#0f0'>OK</span></b> " + item + "@" + source); + } catch (err) { + cli.log("<b><span style='color:#f00'>ERR</span></b> " + err.message); + } + } + reso(); + } catch (err) { + console.error(err); + cli.log("<b><span style='color:#f00'>ERR</span></b> " + err.message); + rej(); + } + }; + xhr.send(); + } catch (err) { + cli.log("<b><span style='color:#f00'>ERR</span></b> " + err.message); + rej(); + } + }); + } + localStorage[".pkg93/config.json"] = JSON.stringify(config); + res(); + }); + }, + get: async function(pkg, version, cli) { + cli = cli || {log: (i) => {$log(i);}}; + version = version || "latest"; + var config = pkg93.getConfig(); + cli.log("<b><span style='color:#f0f'>SRCH</span></b> " + pkg); + var index = config.pkglist.findIndex(function(string) { + return string.split("@")[0] == pkg; + }); + if (index < 0) { + cli.log("<b><span style='color:#f00'>ERR</span></b> Not found."); + return false; + } else { + cli.log("<b><span style='color:#0f0'>OK</span></b> Found!"); + var pkgname = config.pkglist[index].split("@")[0]; + var pkgsource = config.pkglist[index].split("@")[1]; + var dest = pkgsource + "/" + pkgname + "/package.json"; + cli.log("<b><span style='color:#f0f'>GET</span></b> " + dest); + var bardiv = cli.log(_abarpkg93uses(60, 0)); + var xhr = new XMLHttpRequest(); + xhr.open("GET", dest, true); + xhr.onprogress = e => { + try { + bardiv.innerHTML = _abarpkg93uses(60, e.loaded / e.total); + } catch (err) { + // fail silently + } + }; + return new Promise((res, rej) => { + xhr.onerror = () => { + bardiv.innerHTML = errbar; + cli.log("<b><span style='color:#f00'>ERR</span></b> Fatal error while retriving package.json."); + if (xhr.status == 0) { + cli.log("<b><span style='color:#f00'>ERR</span></b> " + xhr.status + " " + xhr.statusText); + } + rej(); + }; + xhr.onload = () => { + try { + cli.log("<b><span style='color:#0f0'>DONE</span></b> " + dest); + var json = JSON.parse(xhr.responseText); + localStorage[".pkg93/packages/" + pkgname + ".json"] = JSON.stringify(json); + if (!json.versions) { + cli.log("<b><span style='color:#ff0'>WARN</span></b> This package does not support versioning, using latest\n<b> </b> version instead."); + } else { + version = (version == "latest") ? json.versions[0] : version; + } + var dest2 = pkgsource + "/" + pkgname + "/" + (json.versions ? version + "/" : "") + json.inject; + cli.log("<b><span style='color:#f0f'>GET</span></b> " + dest2); + var bardiv2 = cli.log(_abarpkg93uses(60, 0)); + var xhr2 = new XMLHttpRequest(); + xhr2.open("GET", dest2, true); + xhr2.onprogress = e => { + try { + bardiv2.innerHTML = _abarpkg93uses(60, e.loaded / e.total); + } catch (err) { + // fail silently + } + }; + xhr2.onerror = () => { + bardiv2.innerHTML = errbar; + cli.log("<b><span style='color:#f00'>ERR</span></b> Fatal error while retriving " + dest2); + if (xhr2.status != 0) { + cli.log("<b><span style='color:#f00'>ERR</span></b> " + xhr2.status + " " + xhr2.statusText); + } + rej(); + }; + xhr2.onload = async () => { + try { + if (xhr2.status != 200) { + throw new Error("Got status " + xhr2.status + " from server."); + } + cli.log("<b><span style='color:#0f0'>DONE</span></b> " + dest2); + var script = xhr2.responseText; + localStorage[".pkg93/packages/" + pkgname + ".js"] = script; + eval(script); + if (json.uninstall) { + // no xhr this time + var uninst = await (await (fetch(pkgsource + "/" + pkgname + "/" + (json.versions ? version + "/" : "") + json.uninstall))).text(); + localStorage[".pkg93/packages/" + pkgname + ".rm.js"] = uninst; + } + if (!config.installed.includes(pkgname)) { + config.installed.push(pkgname); + } + localStorage[".pkg93/config.json"] = JSON.stringify(config); + res(); + // can i go home now + } catch (err) { + cli.log("<b><span style='color:#f00'>ERR</span></b> " + err.message); + rej(err); + } + }; + xhr2.send(); + } catch (err) { + cli.log("<b><span style='color:#f00'>ERR</span></b> " + err.message); + rej(err); + } + }; + try { + xhr.send(); + } catch (err) { + cli.log("<b><span style='color:#f00'>ERR</span></b> " + err.message); + rej(err); + } + }); + } + }, + rm: function(pkg, cli) { + cli = cli || {log: (i) => {$log(i);}}; + var config = pkg93.getConfig(); + var index = config.installed.indexOf(pkg); + if (index < 0) { + cli.log("<b><span style='color:#f00'>ERR</span></b> Not found."); + return false; + } else if (localStorage[".pkg93/packages/" + pkg + ".rm.js"]) { + eval(localStorage[".pkg93/packages/" + pkg + ".rm.js"]); // Typing eval makes me feel dirty. + delete le._apps[config.installed[index]]; + delete localStorage[".pkg93/packages/" + pkg + ".rm.js"]; + delete localStorage[".pkg93/packages/" + pkg + ".js"]; + delete localStorage[".pkg93/packages/" + pkg + ".json"]; + config.installed.splice(index, 1); + cli.log("<b><span style='color:#0f0'>OK</span></b> Removed!"); + return true; + } else { + try { + delete le._apps[config.installed[index]]; + delete localStorage[".pkg93/packages/" + config.installed[index] + ".js"]; + delete localStorage[".pkg93/packages/" + config.installed[index] + ".json"]; + config.installed.splice(index, 1); + cli.log("<b><span style='color:#0f0'>OK</span></b> Removed!"); + localStorage[".pkg93/config.json"] = JSON.stringify(config); + return true; + } catch (err) { + cli.log("<b><span style='color:#f00'>ERR</span></b> " + err.message); + return false; + } + } + }, + pkgInfo: async function(pkg, onlineOnly) { + var config = pkg93.getConfig(); + try { + if (localStorage[".pkg93/packages/" + pkg + ".json"] && !onlineOnly) { + return JSON.parse(localStorage[".pkg93/packages/" + pkg + ".json"]); + } else { + var index = config.pkglist.findIndex(function(string) { + return string.split("@")[0] == pkg; + }); + if (index < 0) { + return false; + } else { + var pkgname = config.pkglist[index].split("@")[0]; + var pkgsource = config.pkglist[index].split("@")[1]; + var json = await (await (fetch(pkgsource + "/" + pkgname + "/package.json"))).json(); + localStorage[".pkg93/packages/" + pkgname + ".json"] = JSON.stringify(json); // save it for later + return json; + } + } + } catch (err) { + console.error("[pkg93] " + err.stack); + return err; + } + }, + shutUp: { + log: ()=>{}, + arg: {arguments:[]} + }, + version: "v2.0.0beta2" +}; + +export { pkg93 }; |