Merge pull request #2824 from bobrippling/setting-data
Check apps register their settings filesmaster
commit
daeae91e15
|
|
@ -14,5 +14,6 @@
|
|||
{"name":"90sclk.app.js","url":"app.js"},
|
||||
{"name":"90sclk.img","url":"app-icon.js","evaluate":true},
|
||||
{"name":"90sclk.settings.js","url":"settings.js"}
|
||||
]
|
||||
],
|
||||
"data": [{"name":"90sclk.setting.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,5 +14,6 @@
|
|||
{"name":"activepedom.settings.js","url":"settings.js"},
|
||||
{"name":"activepedom.img","url":"app-icon.js","evaluate":true},
|
||||
{"name":"activepedom.app.js","url":"app.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"activepedom.settings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,5 +18,6 @@
|
|||
{"name":"bthrm.settings.js","url":"settings.js"},
|
||||
{"name":"bthrm","url":"lib.js"},
|
||||
{"name":"bthrm.default.json","url":"default.json"}
|
||||
]
|
||||
],
|
||||
"data": [{"name":"bthrm.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,5 +15,6 @@
|
|||
{"name":"bwclk.app.js","url":"app.js"},
|
||||
{"name":"bwclk.img","url":"app-icon.js","evaluate":true},
|
||||
{"name":"bwclk.settings.js","url":"settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"bwclk.setting.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,5 +39,10 @@
|
|||
"name": "bwclklite.settings.js",
|
||||
"url": "settings.js"
|
||||
}
|
||||
],
|
||||
"data": [
|
||||
{
|
||||
"name": "bwclklite.setting.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,10 @@
|
|||
"readme": "README.md",
|
||||
"storage": [
|
||||
{ "name": "cassioWatch.app.js", "url": "app.js" },
|
||||
{"name":"cassioWatch.settings.js","url":"settings.js"},
|
||||
{ "name": "cassioWatch.settings.js","url": "settings.js" },
|
||||
{ "name": "cassioWatch.img", "url": "icon.js", "evaluate": true }
|
||||
],
|
||||
"data": [
|
||||
{ "name": "cassioWatch.settings.json" }
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,5 +11,6 @@
|
|||
"storage": [
|
||||
{"name":"chargerot.boot.js","url":"boot.js"},
|
||||
{"name":"chargerot.settings.js","url":"settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"chargerot.settings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,36 +0,0 @@
|
|||
const enum StopWatchFormat {
|
||||
HMS,
|
||||
Colon,
|
||||
}
|
||||
type StopWatchSettings = {
|
||||
format: StopWatchFormat,
|
||||
};
|
||||
|
||||
(back => {
|
||||
const SETTINGS_FILE = "clkinfostopw.setting.json";
|
||||
|
||||
const storage = require("Storage");
|
||||
const settings: StopWatchSettings = Object.assign(
|
||||
{ format: StopWatchFormat.HMS },
|
||||
storage.readJSON(SETTINGS_FILE, true),
|
||||
);
|
||||
|
||||
const save = () => {
|
||||
storage.writeJSON(SETTINGS_FILE, settings)
|
||||
};
|
||||
|
||||
E.showMenu({
|
||||
"": { "title": "stopwatch" },
|
||||
"< Back": back,
|
||||
"Format": {
|
||||
value: settings.format,
|
||||
min: StopWatchFormat.HMS,
|
||||
max: StopWatchFormat.Colon,
|
||||
format: v => v === StopWatchFormat.HMS ? "12m34s" : "12:34",
|
||||
onchange: v => {
|
||||
settings.format = v;
|
||||
save();
|
||||
},
|
||||
},
|
||||
});
|
||||
}) satisfies SettingsFunc
|
||||
|
|
@ -15,5 +15,6 @@
|
|||
{"name":"contourclock.settings.js","url":"contourclock.settings.js"},
|
||||
{"name":"contourclock","url":"lib.js"},
|
||||
{"name":"contourclock.img","url":"app-icon.js","evaluate":true}
|
||||
]
|
||||
],
|
||||
"data": [{"name":"contourclock.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,5 +13,6 @@
|
|||
{"name":"cprassist.app.js","url":"cprassist.js"},
|
||||
{"name":"cprassist.img","url":"cprassist-icon.js","evaluate":true},
|
||||
{"name":"cprassist.settings.js","url":"settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"cprassist.settings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,5 +12,8 @@
|
|||
{"name":"cscsensor.app.js","url":"cscsensor.app.js"},
|
||||
{"name":"cscsensor.settings.js","url":"settings.js"},
|
||||
{"name":"cscsensor.img","url":"cscsensor-icon.js","evaluate":true}
|
||||
],
|
||||
"data": [
|
||||
{"name":"cscsensor.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,5 +13,8 @@
|
|||
{"name":"cycling.settings.js","url":"settings.js"},
|
||||
{"name":"blecsc","url":"blecsc.js"},
|
||||
{"name":"cycling.img","url":"cycling.icon.js","evaluate": true}
|
||||
],
|
||||
"data": [
|
||||
{"name":"cycling.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,10 +6,13 @@
|
|||
"type":"textinput",
|
||||
"tags": "keyboard",
|
||||
"supports" : ["BANGLEJS2"],
|
||||
"screenshots": [{"url":"screenshot.png"}],
|
||||
"screenshots": [{"url":"screenshot.png"}],
|
||||
"readme": "README.md",
|
||||
"storage": [
|
||||
{"name":"textinput","url":"lib.js"},
|
||||
{"name":"dragboard.settings.js","url":"settings.js"}
|
||||
],
|
||||
"data": [
|
||||
{"name":"dragboard.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,10 +6,13 @@
|
|||
"type":"textinput",
|
||||
"tags": "keyboard",
|
||||
"supports" : ["BANGLEJS2"],
|
||||
"screenshots": [{"url":"screenshot.png"}],
|
||||
"screenshots": [{"url":"screenshot.png"}],
|
||||
"readme": "README.md",
|
||||
"storage": [
|
||||
{"name":"textinput","url":"lib.js"},
|
||||
{"name":"draguboard.settings.js","url":"settings.js"}
|
||||
],
|
||||
"data": [
|
||||
{"name":"draguboard.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,5 +12,6 @@
|
|||
{"name":"f9lander.app.js","url":"app.js"},
|
||||
{"name":"f9lander.img","url":"app-icon.js","evaluate":true},
|
||||
{"name":"f9lander.settings.js", "url":"settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"f9settings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,5 +14,6 @@
|
|||
{"name":"game1024.app.js","url":"app.js"},
|
||||
{"name":"game1024.settings.js","url":"settings.js"},
|
||||
{"name":"game1024.img","url":"app-icon.js","evaluate":true}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"game1024.settings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,5 +14,6 @@
|
|||
{"name":"getup.app.js","url":"app.js"},
|
||||
{"name":"getup.settings.js","url":"settings.js"},
|
||||
{"name":"getup.img","url":"app-icon.js","evaluate":true}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"getup.settings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,5 +20,6 @@
|
|||
{"name":"happyclk.app.js","url":"happyclk.app.js"},
|
||||
{"name":"happyclk.img","url":"happyclk.icon.js","evaluate":true},
|
||||
{"name":"happyclk.settings.js","url":"happyclk.settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"happyclk.setting.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
"shortName":"HR Alarm",
|
||||
"version":"0.02",
|
||||
"description": "This invisible widget vibrates whenever the heart rate gets close to the upper limit or goes over or under the configured limits",
|
||||
"icon": "widget.png",
|
||||
"icon": "widget.png",
|
||||
"type": "widget",
|
||||
"tags": "widget",
|
||||
"supports" : ["BANGLEJS2"],
|
||||
|
|
@ -12,5 +12,8 @@
|
|||
"storage": [
|
||||
{"name":"hralarm.wid.js","url":"widget.js"},
|
||||
{"name":"hralarm.settings.js","url":"settings.js"}
|
||||
],
|
||||
"data": [
|
||||
{"name":"hralarm.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,5 +15,8 @@
|
|||
{"name":"imageclock.app.js","url":"app.js"},
|
||||
{"name":"imageclock.settings.js","url":"settings.js"},
|
||||
{"name":"imageclock.img","url":"app-icon.js","evaluate":true}
|
||||
],
|
||||
"data": [
|
||||
{"name":"imageclock.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,5 +12,6 @@
|
|||
{"name":"textinput","url":"lib.js"},
|
||||
{"name":"kbtouch.settings.js","url":"settings.js"}
|
||||
],
|
||||
"sortorder":-1
|
||||
"sortorder":-1,
|
||||
"data":[{"name":"kbtouch.settings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,5 +16,6 @@
|
|||
{"name":"lcars.app.js","url":"lcars.app.js"},
|
||||
{"name":"lcars.img","url":"lcars.icon.js","evaluate":true},
|
||||
{"name":"lcars.settings.js","url":"lcars.settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"lcars.setting.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,5 +13,8 @@
|
|||
{"name":"limelight.app.js","url":"limelight.app.js"},
|
||||
{"name":"limelight.settings.js","url":"limelight.settings.js"},
|
||||
{"name":"limelight.img","url":"limelight.icon.js","evaluate":true}
|
||||
],
|
||||
"data": [
|
||||
{"name":"limelight.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,5 +14,6 @@
|
|||
{"name":"linuxclock.app.js","url":"app.js"},
|
||||
{"name":"linuxclock.img","url":"app-icon.js","evaluate":true},
|
||||
{"name":"linuxclock.settings.js","url":"settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"linuxclock.setting.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,5 +10,6 @@
|
|||
"readme": "README.md",
|
||||
"storage": [
|
||||
{"name":"loadingscreen.settings.js","url":"settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":".loading"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,5 +13,6 @@
|
|||
{"name":"metronome.app.js","url":"metronome.js"},
|
||||
{"name":"metronome.img","url":"metronome-icon.js","evaluate":true},
|
||||
{"name":"metronome.settings.js","url":"settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"metronome.settings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,5 +14,8 @@
|
|||
{"name":"mysticclock.app.js","url":"mystic-clock-app.js"},
|
||||
{"name":"mysticclock.settings.js","url":"mystic-clock-settings.js"},
|
||||
{"name":"mysticclock.img","url":"mystic-clock-icon.js","evaluate":true}
|
||||
],
|
||||
"data": [
|
||||
{"name":"mysticclock.settings.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,5 +13,8 @@
|
|||
{"name":"mysticdock.boot.js","url":"mystic-dock-boot.js"},
|
||||
{"name":"mysticdock.settings.js","url":"mystic-dock-settings.js"},
|
||||
{"name":"mysticdock.img","url":"mystic-dock-icon.js","evaluate":true}
|
||||
],
|
||||
"data": [
|
||||
{"name":"mysticdock.settings.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,10 +6,11 @@
|
|||
"icon": "openwind.png",
|
||||
"readme": "README.md",
|
||||
"tags": "ble,outdoors,gps,sailing",
|
||||
"supports" : ["BANGLEJS", "BANGLEJS2"],
|
||||
"supports" : ["BANGLEJS", "BANGLEJS2"],
|
||||
"storage": [
|
||||
{"name":"openwind.app.js","url":"app.js"},
|
||||
{"name":"openwind.img","url":"app-icon.js","evaluate":true},
|
||||
{"name":"openwind.settings.js", "url":"settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"openwindsettings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,5 +15,8 @@
|
|||
{"name":"pebble.app.js","url":"pebble.app.js"},
|
||||
{"name":"pebble.settings.js","url":"pebble.settings.js"},
|
||||
{"name":"pebble.img","url":"pebble.icon.js","evaluate":true}
|
||||
],
|
||||
"data": [
|
||||
{"name":"pebble.settings.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,5 +14,6 @@
|
|||
{"name":"pebbled.app.js","url":"pebbled.app.js"},
|
||||
{"name":"pebbled.settings.js","url":"pebbled.settings.js"},
|
||||
{"name":"pebbled.img","url":"pebbled.icon.js","evaluate":true}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"pebbleDistance.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,5 +15,8 @@
|
|||
{"name":"pebblepp.app.js","url":"app.js"},
|
||||
{"name":"pebblepp.settings.js","url":"settings.js"},
|
||||
{"name":"pebblepp.img","url":"icon.js","evaluate":true}
|
||||
],
|
||||
"data": [
|
||||
{"name":"pebblepp.settings.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,5 +32,8 @@
|
|||
"name": "pomoplus.settings.js",
|
||||
"url": "settings.js"
|
||||
}
|
||||
],
|
||||
"data": [
|
||||
{"name":"pomoplus.settings.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,5 +15,8 @@
|
|||
{"name":"rebble.app.js","url":"rebble.app.js"},
|
||||
{"name":"rebble.settings.js","url":"rebble.settings.js"},
|
||||
{"name":"rebble.img","url":"rebble.icon.js","evaluate":true}
|
||||
],
|
||||
"data": [
|
||||
{"name":"rebble.settings.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,5 +14,8 @@
|
|||
{"name":"sensortools.settings.js","url":"settings.js"},
|
||||
{"name":"sensortools","url":"lib.js"},
|
||||
{"name":"sensortools.default.json","url":"default.json"}
|
||||
],
|
||||
"data": [
|
||||
{"name":"sensortools.settings.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,5 +17,6 @@
|
|||
{"name": "sleeplogalarm", "url": "lib.js"},
|
||||
{"name": "sleeplogalarm.settings.js", "url": "settings.js"},
|
||||
{"name": "sleeplogalarm.wid.js", "url": "widget.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"sleeplogalarm.settings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,5 +15,8 @@
|
|||
{"name":"speedalt.app.js","url":"app.js"},
|
||||
{"name":"speedalt.img","url":"app-icon.js","evaluate":true},
|
||||
{"name":"speedalt.settings.js","url":"settings.js"}
|
||||
],
|
||||
"data": [
|
||||
{"name":"speedalt.settings.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,5 +12,6 @@
|
|||
"storage": [
|
||||
{"name":"timecal.app.js","url":"timecal.app.js"},
|
||||
{"name":"timecal.settings.js","url":"timecal.settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"timecal.settings.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,5 +13,8 @@
|
|||
{"name":"torch.wid.js","url":"widget.js","supports": ["BANGLEJS"]},
|
||||
{"name":"torch.img","url":"app-icon.js","evaluate":true},
|
||||
{"name":"torch.settings.js","url":"settings.js"}
|
||||
],
|
||||
"data": [
|
||||
{"name":"torch.settings.json"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,5 +10,6 @@
|
|||
"storage": [
|
||||
{"name":"widpedom.wid.js","url":"widget.js"},
|
||||
{"name":"widpedom.settings.js","url":"settings.js"}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"wpedom.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,5 +14,6 @@
|
|||
{"name":"wohrm.app.js","url":"app.js"},
|
||||
{"name":"wohrm.settings.js","url":"settings.js"},
|
||||
{"name":"wohrm.img","url":"app-icon.js","evaluate":true}
|
||||
]
|
||||
],
|
||||
"data":[{"name":"wohrm.setting.json"}]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -92,9 +92,12 @@ const INTERNAL_FILES_IN_APP_TYPE = { // list of app types and files they SHOULD
|
|||
};
|
||||
/* These are warnings we know about but don't want in our output */
|
||||
var KNOWN_WARNINGS = [
|
||||
"App gpsrec data file wildcard .gpsrc? does not include app ID",
|
||||
"App owmweather data file weather.json is also listed as data file for app weather",
|
||||
"App gpsrec data file wildcard .gpsrc? does not include app ID",
|
||||
"App owmweather data file weather.json is also listed as data file for app weather",
|
||||
"App messagegui storage file messagegui is also listed as storage file for app messagelist",
|
||||
"App carcrazy has a setting file but no corresponding data entry (add `\"data\":[{\"name\":\"carcrazy.settings.json\"}]`)",
|
||||
"App loadingscreen has a setting file but no corresponding data entry (add `\"data\":[{\"name\":\"loadingscreen.settings.json\"}]`)",
|
||||
"App trex has a setting file but no corresponding data entry (add `\"data\":[{\"name\":\"trex.settings.json\"}]`)",
|
||||
];
|
||||
|
||||
function globToRegex(pattern) {
|
||||
|
|
@ -116,7 +119,7 @@ apps.forEach((app,appIdx) => {
|
|||
if (!app.id) ERROR(`App ${appIdx} has no id`);
|
||||
var appDirRelative = APPSDIR_RELATIVE+app.id+"/";
|
||||
var appDir = APPSDIR+app.id+"/";
|
||||
var metadataFile = appDirRelative+"metadata.json";
|
||||
var metadataFile = appDirRelative+"metadata.json";
|
||||
if (existingApps.includes(app.id)) ERROR(`Duplicate app '${app.id}'`, {file:metadataFile});
|
||||
existingApps.push(app.id);
|
||||
//console.log(`Checking ${app.id}...`);
|
||||
|
|
@ -164,11 +167,11 @@ apps.forEach((app,appIdx) => {
|
|||
});
|
||||
}
|
||||
if (app.readme) {
|
||||
if (!fs.existsSync(appDir+app.readme))
|
||||
if (!fs.existsSync(appDir+app.readme))
|
||||
ERROR(`App ${app.id} README file doesn't exist`, {file:metadataFile});
|
||||
} else {
|
||||
let readme = fs.readdirSync(appDir).find(f => f.toLowerCase().includes("readme"));
|
||||
if (readme)
|
||||
if (readme)
|
||||
ERROR(`App ${app.id} has a README in the directory (${readme}) but it's not linked`, {file:metadataFile});
|
||||
}
|
||||
if (app.custom && !fs.existsSync(appDir+app.custom)) ERROR(`App ${app.id} custom HTML doesn't exist`, {file:metadataFile});
|
||||
|
|
@ -253,6 +256,10 @@ apps.forEach((app,appIdx) => {
|
|||
if (a>=0 && b>=0 && a<b)
|
||||
WARN(`Clock ${app.id} file calls loadWidgets before setUI (clock widget/etc won't be aware a clock app is running)`, {file:appDirRelative+file.url, line : fileContents.substr(0,a).split("\n").length});
|
||||
}
|
||||
// if settings, suggest adding to datafiles
|
||||
if (/\.settings?\.js$/.test(file.name) && (!app.data || app.data.every(d => !d.name || !d.name.endsWith(".json")))) {
|
||||
WARN(`App ${app.id} has a setting file but no corresponding data entry (add \`"data":[{"name":"${app.id}.settings.json"}]\`)`, {file:appDirRelative+file.url});
|
||||
}
|
||||
}
|
||||
for (const key in file) {
|
||||
if (!STORAGE_KEYS.includes(key)) ERROR(`App ${app.id} file ${file.name} has unknown key ${key}`, {file:appDirRelative+file.url});
|
||||
|
|
|
|||
Loading…
Reference in New Issue