var errbar = "[---------------------------------------------------] ERR! !";
// 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 ? "✔️" : ticker;
let pbar = "[";
for (let i = 0; i < Math.floor(percent*barwidth); ++i) pbar += "=";
pbar += "";
for (let i = 0; i < Math.ceil((1-percent)*barwidth); ++i) pbar += "-";
pbar += "] " + 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("GET " + 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("ERR Fatal error while retriving package.json.");
if (xhr.status != 0) {
cli.log("ERR " + xhr.status + " " + xhr.statusText);
}
};
xhr.onload = () => {
try {
var json = JSON.parse(xhr.responseText);
cli.log("NAME " + json.name);
cli.log("MSG " + json.msg);
for (let item of json.packages) {
try {
config.pkglist.push(item + "@" + source);
cli.log("OK " + item + "@" + source);
} catch (err) {
cli.log("ERR " + err.message);
}
}
reso();
} catch (err) {
console.error(err);
cli.log("ERR " + err.message);
rej();
}
};
xhr.send();
} catch (err) {
cli.log("ERR " + 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("SRCH " + pkg);
var index = config.pkglist.findIndex(function(string) {
return string.split("@")[0] == pkg;
});
if (index < 0) {
cli.log("ERR Not found.");
return false;
} else {
cli.log("OK Found!");
var pkgname = config.pkglist[index].split("@")[0];
var pkgsource = config.pkglist[index].split("@")[1];
var dest = pkgsource + "/" + pkgname + "/package.json";
cli.log("GET " + 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("ERR Fatal error while retriving package.json.");
if (xhr.status == 0) {
cli.log("ERR " + xhr.status + " " + xhr.statusText);
}
rej();
};
xhr.onload = () => {
try {
cli.log("DONE " + dest);
var json = JSON.parse(xhr.responseText);
localStorage[".pkg93/packages/" + pkgname + ".json"] = JSON.stringify(json);
if (!json.versions) {
cli.log("WARN This package does not support versioning, using latest\n version instead.");
} else {
version = (version == "latest") ? json.versions[0] : version;
}
var dest2 = pkgsource + "/" + pkgname + "/" + (json.versions ? version + "/" : "") + json.inject;
cli.log("GET " + 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("ERR Fatal error while retriving " + dest2);
if (xhr2.status != 0) {
cli.log("ERR " + xhr2.status + " " + xhr2.statusText);
}
rej();
};
xhr2.onload = async () => {
try {
if (xhr2.status != 200) {
throw new Error("Got status " + xhr2.status + " from server.");
}
cli.log("DONE " + 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("ERR " + err.message);
rej(err);
}
};
xhr2.send();
} catch (err) {
cli.log("ERR " + err.message);
rej(err);
}
};
try {
xhr.send();
} catch (err) {
cli.log("ERR " + 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("ERR 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("OK 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("OK Removed!");
localStorage[".pkg93/config.json"] = JSON.stringify(config);
return true;
} catch (err) {
cli.log("ERR " + 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 };