mirror of
https://github.com/gethomepage/homepage.git
synced 2026-09-26 22:11:20 -07:00
Docker CI / Docker Build & Push (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
50 lines
1.2 KiB
JavaScript
50 lines
1.2 KiB
JavaScript
import createLogger from "utils/logger";
|
|
import widgets from "widgets/widgets";
|
|
|
|
const logger = createLogger("validateWidgetData");
|
|
|
|
export default function validateWidgetData(widget, endpoint, data) {
|
|
let valid = true;
|
|
let dataParsed = data;
|
|
let error;
|
|
let mapping;
|
|
const mappings = widgets[widget.type]?.mappings;
|
|
if (mappings) {
|
|
mapping = Object.values(mappings).find((m) => m.endpoint === endpoint);
|
|
}
|
|
|
|
if (mapping?.allowEmpty && Buffer.isBuffer(data) && data.length === 0) return true;
|
|
|
|
if (Buffer.isBuffer(data)) {
|
|
try {
|
|
dataParsed = JSON.parse(data);
|
|
} catch (e) {
|
|
try {
|
|
// try once more stripping whitespace
|
|
dataParsed = JSON.parse(data.toString().replace(/\s/g, ""));
|
|
} catch (e2) {
|
|
error = e || e2;
|
|
valid = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (dataParsed && Object.entries(dataParsed).length) {
|
|
mapping?.validate?.forEach((key) => {
|
|
if (dataParsed[key] === undefined) {
|
|
valid = false;
|
|
}
|
|
});
|
|
}
|
|
|
|
if (!valid) {
|
|
logger.error(
|
|
`Invalid data for widget '${widget.type}' endpoint '${endpoint}':\nExpected:${mapping?.validate}\nParse error: ${
|
|
error ?? "none"
|
|
}\nData: ${JSON.stringify(data)}`,
|
|
);
|
|
}
|
|
|
|
return valid;
|
|
}
|