Merge pull request #2824 from bobrippling/setting-data

Check apps register their settings files
master
Gordon Williams 2023-06-21 09:23:03 +01:00 committed by GitHub
commit daeae91e15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 117 additions and 68 deletions

View File

@ -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"}]
}

View File

@ -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"}]
}

View File

@ -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"}]
}

View File

@ -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"}]
}

View File

@ -39,5 +39,10 @@
"name": "bwclklite.settings.js",
"url": "settings.js"
}
],
"data": [
{
"name": "bwclklite.setting.json"
}
]
}

View File

@ -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" }
]
}

View File

@ -11,5 +11,6 @@
"storage": [
{"name":"chargerot.boot.js","url":"boot.js"},
{"name":"chargerot.settings.js","url":"settings.js"}
]
],
"data":[{"name":"chargerot.settings.json"}]
}

View File

@ -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

View File

@ -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"}]
}

View File

@ -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"}]
}

View File

@ -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"}
]
}

View File

@ -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"}
]
}

View File

@ -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"}
]
}

View File

@ -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"}
]
}

View File

@ -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"}]
}

View File

@ -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"}]
}

View File

@ -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"}]
}

View File

@ -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"}]
}

View File

@ -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"}
]
}

View File

@ -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"}
]
}

View File

@ -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"}]
}

View File

@ -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"}]
}

View File

@ -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"}
]
}

View File

@ -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"}]
}

View File

@ -10,5 +10,6 @@
"readme": "README.md",
"storage": [
{"name":"loadingscreen.settings.js","url":"settings.js"}
]
],
"data":[{"name":".loading"}]
}

View File

@ -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"}]
}

View File

@ -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"}
]
}

View File

@ -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"}
]
}

View File

@ -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"}]
}

View File

@ -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"}
]
}

View File

@ -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"}]
}

View File

@ -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"}
]
}

View File

@ -32,5 +32,8 @@
"name": "pomoplus.settings.js",
"url": "settings.js"
}
],
"data": [
{"name":"pomoplus.settings.json"}
]
}

View File

@ -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"}
]
}

View File

@ -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"}
]
}

View File

@ -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"}]
}

View File

@ -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"}
]
}

View File

@ -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"}]
}

View File

@ -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"}
]
}

View File

@ -10,5 +10,6 @@
"storage": [
{"name":"widpedom.wid.js","url":"widget.js"},
{"name":"widpedom.settings.js","url":"settings.js"}
]
],
"data":[{"name":"wpedom.json"}]
}

View File

@ -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"}]
}

View File

@ -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});