BangleApps/bin/lib/apploader.js

102 lines
3.1 KiB
JavaScript
Raw Normal View History

/* Node.js library with utilities to handle using the app loader from node.js */
var DEVICEID = "BANGLEJS2";
var MINIFY = true; // minify JSON?
var BASE_DIR = __dirname + "/../..";
var APPSDIR = BASE_DIR+"/apps/";
//eval(require("fs").readFileSync(__dirname+"../core/js/utils.js"));
var Espruino = require(__dirname + "/../../core/lib/espruinotools.js");
//eval(require("fs").readFileSync(__dirname + "/../../core/lib/espruinotools.js").toString());
//eval(require("fs").readFileSync(__dirname + "/../../core/js/utils.js").toString());
var AppInfo = require(__dirname+"/../../core/js/appinfo.js");
var SETTINGS = {
pretokenise : true
};
global.Const = {
/* Are we only putting a single app on a device? If so
apps should all be saved as .bootcde and we write info
about the current app into app.info */
SINGLE_APP_ONLY : false,
};
var apps = [];
2023-01-12 11:49:52 +00:00
var device = { id : DEVICEID, appsInstalled : [] };
// call with {DEVICEID:"BANGLEJS/BANGLEJS2"}
exports.init = function(options) {
if (options.DEVICEID)
DEVICEID = options.DEVICEID;
// Load app metadata
var dirs = require("fs").readdirSync(APPSDIR, {withFileTypes: true});
dirs.forEach(dir => {
var appsFile;
if (dir.name.startsWith("_example") || !dir.isDirectory())
return;
try {
appsFile = require("fs").readFileSync(APPSDIR+dir.name+"/metadata.json").toString();
} catch (e) {
ERROR(dir.name+"/metadata.json does not exist");
return;
}
apps.push(JSON.parse(appsFile));
});
};
exports.AppInfo = AppInfo;
exports.apps = apps;
// used by getAppFiles
function fileGetter(url) {
url = BASE_DIR+"/"+url;
console.log("Loading "+url)
var data;
if (MINIFY && url.endsWith(".json")) {
var f = url.slice(0,-5);
console.log("MINIFYING JSON "+f);
var j = eval("("+require("fs").readFileSync(url).toString("binary")+")");
data = JSON.stringify(j);
} else {
var blob = require("fs").readFileSync(url);
if (url.endsWith(".js") || url.endsWith(".json"))
data = blob.toString(); // allow JS/etc to be written in UTF-8
else
data = blob.toString("binary")
}
return Promise.resolve(data);
}
exports.getAppFiles = function(app) {
2023-01-12 11:49:52 +00:00
var allFiles = [];
var uploadOptions = {
apps : apps,
needsApp : app => {
if (app.provides_modules) {
if (!app.files) app.files="";
app.files = app.files.split(",").concat(app.provides_modules).join(",");
}
return AppInfo.getFiles(app, {
fileGetter:fileGetter,
settings : SETTINGS,
device : { id : DEVICEID }
}).then(files => { allFiles = allFiles.concat(files); return app; });
}
};
return AppInfo.checkDependencies(app, device, uploadOptions).then(() => AppInfo.getFiles(app, {
fileGetter:fileGetter,
settings : SETTINGS,
2023-01-12 11:49:52 +00:00
device : device
})).then(files => {
allFiles = allFiles.concat(files);
return allFiles;
});
};
// Get all the files for this app as a string of Storage.write commands
exports.getAppFilesString = function(app) {
return exports.getAppFiles(app).then(files => {
return files.map(f=>f.cmd).join("\n")+"\n"
})
};