chore: enable formatting over the entire codebase in CI (#6655)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Frank Elsinga
2026-01-09 02:10:36 +01:00
committed by GitHub
parent 6658f2ce41
commit 0f61d7ee1b
422 changed files with 30899 additions and 27379 deletions
+22 -12
View File
@@ -7,10 +7,12 @@ const { Notification } = require("../notification");
const { default: NodeFetchCache, MemoryCache } = require("node-fetch-cache");
const TranslatableError = require("../translatable-error");
const cachedFetch = process.env.NODE_ENV ? NodeFetchCache.create({
// cache for 8h
cache: new MemoryCache({ ttl: 1000 * 60 * 60 * 8 })
}) : fetch;
const cachedFetch = process.env.NODE_ENV
? NodeFetchCache.create({
// cache for 8h
cache: new MemoryCache({ ttl: 1000 * 60 * 60 * 8 }),
})
: fetch;
/**
* Find the RDAP server for a given TLD
@@ -28,7 +30,7 @@ async function getRdapServer(tld) {
}
for (const service of rdapList["services"]) {
const [ tlds, urls ] = service;
const [tlds, urls] = service;
if (tlds.includes(tld)) {
return urls[0];
}
@@ -108,7 +110,7 @@ class DomainExpiry extends BeanModel {
* @returns {Promise<DomainExpiry>} Domain bean
*/
static async findByName(domain) {
return R.findOne("domain_expiry", "domain = ?", [ domain ]);
return R.findOne("domain_expiry", "domain = ?", [domain]);
}
/**
@@ -159,7 +161,7 @@ class DomainExpiry extends BeanModel {
if (!tld.domain) {
throw new TranslatableError("domain_expiry_unsupported_invalid_domain", { hostname: tld.hostname });
}
if ( !tld.publicSuffix) {
if (!tld.publicSuffix) {
throw new TranslatableError("domain_expiry_unsupported_public_suffix", { publicSuffix: tld.publicSuffix });
}
if (tld.isIp) {
@@ -176,9 +178,14 @@ class DomainExpiry extends BeanModel {
// Only warn when the monitor actually has domain expiry notifications enabled.
// The edit monitor page calls this method frequently while the user is typing.
if (Boolean(monitor.domainExpiryNotification)) {
log.warn("domain_expiry", `Domain expiry unsupported for '.${tld.publicSuffix}' because its RDAP endpoint is not listed in the IANA database.`);
log.warn(
"domain_expiry",
`Domain expiry unsupported for '.${tld.publicSuffix}' because its RDAP endpoint is not listed in the IANA database.`
);
}
throw new TranslatableError("domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint", { publicSuffix: tld.publicSuffix });
throw new TranslatableError("domain_expiry_unsupported_unsupported_tld_no_rdap_endpoint", {
publicSuffix: tld.publicSuffix,
});
}
return {
@@ -258,7 +265,10 @@ class DomainExpiry extends BeanModel {
}
// sanity check if expiry date is valid before calculating days remaining. Should not happen and likely indicates a bug in the code.
if (!domain.expiry || isNaN(new Date(domain.expiry).getTime())) {
log.warn("domain_expiry", `No valid expiry date passed to sendNotifications for ${domainName} (expiry: ${domain.expiry}), skipping notification`);
log.warn(
"domain_expiry",
`No valid expiry date passed to sendNotifications for ${domainName} (expiry: ${domain.expiry}), skipping notification`
);
return;
}
@@ -269,8 +279,8 @@ class DomainExpiry extends BeanModel {
let notifyDays = await setting("domainExpiryNotifyDays");
if (notifyDays == null || !Array.isArray(notifyDays)) {
// Reset Default
await setSetting("domainExpiryNotifyDays", [ 7, 14, 21 ], "general");
notifyDays = [ 7, 14, 21 ];
await setSetting("domainExpiryNotifyDays", [7, 14, 21], "general");
notifyDays = [7, 14, 21];
}
if (Array.isArray(notifyDays)) {
// Asc sort to avoid sending multiple notifications if daysRemaining is below multiple targetDays
+8 -5
View File
@@ -2,7 +2,6 @@ const { BeanModel } = require("redbean-node/dist/bean-model");
const { R } = require("redbean-node");
class Group extends BeanModel {
/**
* Return an object that ready to parse to JSON for public Only show
* necessary data to public
@@ -32,14 +31,18 @@ class Group extends BeanModel {
* @returns {Promise<Bean[]>} List of monitors
*/
async getMonitorList() {
return R.convertToBeans("monitor", await R.getAll(`
return R.convertToBeans(
"monitor",
await R.getAll(
`
SELECT monitor.*, monitor_group.send_url, monitor_group.custom_url FROM monitor, monitor_group
WHERE monitor.id = monitor_group.monitor_id
AND group_id = ?
ORDER BY monitor_group.weight
`, [
this.id,
]));
`,
[this.id]
)
);
}
}
+1 -3
View File
@@ -8,7 +8,6 @@ const { BeanModel } = require("redbean-node/dist/bean-model");
* 3 = MAINTENANCE
*/
class Heartbeat extends BeanModel {
/**
* Return an object that ready to parse to JSON for public
* Only show necessary data to public
@@ -18,7 +17,7 @@ class Heartbeat extends BeanModel {
return {
status: this.status,
time: this.time,
msg: "", // Hide for public
msg: "", // Hide for public
ping: this.ping,
};
}
@@ -39,7 +38,6 @@ class Heartbeat extends BeanModel {
retries: this._retries,
};
}
}
module.exports = Heartbeat;
-1
View File
@@ -1,7 +1,6 @@
const { BeanModel } = require("redbean-node/dist/bean-model");
class Incident extends BeanModel {
/**
* Return an object that ready to parse to JSON for public
* Only show necessary data to public
+42 -34
View File
@@ -7,14 +7,12 @@ const { UptimeKumaServer } = require("../uptime-kuma-server");
const apicache = require("../modules/apicache");
class Maintenance extends BeanModel {
/**
* Return an object that ready to parse to JSON for public
* Only show necessary data to public
* @returns {Promise<object>} Object ready to parse
*/
async toPublicJSON() {
let dateRange = [];
if (this.start_date) {
dateRange.push(this.start_date);
@@ -41,14 +39,14 @@ class Maintenance extends BeanModel {
active: !!this.active,
dateRange: dateRange,
timeRange: timeRange,
weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [],
daysOfMonth: (this.days_of_month) ? JSON.parse(this.days_of_month) : [],
weekdays: this.weekdays ? JSON.parse(this.weekdays) : [],
daysOfMonth: this.days_of_month ? JSON.parse(this.days_of_month) : [],
timeslotList: [],
cron: this.cron,
duration: this.duration,
durationMinutes: parseInt(this.duration / 60),
timezone: await this.getTimezone(), // Only valid timezone
timezoneOption: this.timezone, // Mainly for dropdown menu, because there is a option "SAME_AS_SERVER"
timezone: await this.getTimezone(), // Only valid timezone
timezoneOption: this.timezone, // Mainly for dropdown menu, because there is a option "SAME_AS_SERVER"
timezoneOffset: await this.getTimezoneOffset(),
status: await this.getStatus(),
};
@@ -202,7 +200,7 @@ class Maintenance extends BeanModel {
* @returns {void}
*/
static validateCron(cron) {
let job = new Cron(cron, () => { });
let job = new Cron(cron, () => {});
job.stop();
}
@@ -270,7 +268,7 @@ class Maintenance extends BeanModel {
if (this.strategy === "recurring-interval") {
// For recurring-interval, Croner needs to have interval and startAt
const startDate = dayjs(this.startDate);
const [ hour, minute ] = this.startTime.split(":");
const [hour, minute] = this.startTime.split(":");
const startDateTime = startDate.hour(hour).minute(minute);
// Fix #6118, since the startDateTime is optional, it will throw error if the date is null when using toISOString()
@@ -279,31 +277,44 @@ class Maintenance extends BeanModel {
startAt = startDateTime.toISOString();
} catch (_) {}
this.beanMeta.job = new Cron(this.cron, {
timezone: await this.getTimezone(),
startAt,
}, () => {
if (!this.lastStartDate || this.interval_day === 1) {
this.beanMeta.job = new Cron(
this.cron,
{
timezone: await this.getTimezone(),
startAt,
},
() => {
if (!this.lastStartDate || this.interval_day === 1) {
return startEvent();
}
// If last start date is set, it means the maintenance has been started before
let lastStartDate = dayjs(this.lastStartDate).subtract(1.1, "hour"); // Subtract 1.1 hour to avoid issues with timezone differences
// Check if the interval is enough
if (current.diff(lastStartDate, "day") < this.interval_day) {
log.debug(
"maintenance",
"Maintenance id: " + this.id + " is still in the window, skipping start event"
);
return;
}
log.debug(
"maintenance",
"Maintenance id: " + this.id + " is not in the window, starting event"
);
return startEvent();
}
// If last start date is set, it means the maintenance has been started before
let lastStartDate = dayjs(this.lastStartDate)
.subtract(1.1, "hour"); // Subtract 1.1 hour to avoid issues with timezone differences
// Check if the interval is enough
if (current.diff(lastStartDate, "day") < this.interval_day) {
log.debug("maintenance", "Maintenance id: " + this.id + " is still in the window, skipping start event");
return;
}
log.debug("maintenance", "Maintenance id: " + this.id + " is not in the window, starting event");
return startEvent();
});
);
} else {
this.beanMeta.job = new Cron(this.cron, {
timezone: await this.getTimezone(),
}, startEvent);
this.beanMeta.job = new Cron(
this.cron,
{
timezone: await this.getTimezone(),
},
startEvent
);
}
// Continue if the maintenance is still in the window
@@ -314,7 +325,6 @@ class Maintenance extends BeanModel {
log.debug("maintenance", "Maintenance id: " + this.id + " Remaining duration: " + duration + "ms");
startEvent(duration);
}
} catch (e) {
log.error("maintenance", "Error in maintenance id: " + this.id);
log.error("maintenance", "Cron: " + this.cron);
@@ -324,7 +334,6 @@ class Maintenance extends BeanModel {
throw e;
}
}
} else {
log.error("maintenance", "Maintenance id: " + this.id + " has no cron");
}
@@ -486,12 +495,11 @@ class Maintenance extends BeanModel {
}
// Remove duplicate
dayList = [ ...new Set(dayList) ];
dayList = [...new Set(dayList)];
this.cron = minute + " " + hour + " " + dayList.join(",") + " * *";
this.duration = this.calcDuration();
}
}
}
+315 -177
View File
File diff suppressed because it is too large Load Diff
+35 -45
View File
@@ -9,15 +9,22 @@ const { Feed } = require("feed");
const config = require("../config");
const { setting } = require("../util-server");
const { STATUS_PAGE_ALL_DOWN, STATUS_PAGE_ALL_UP, STATUS_PAGE_MAINTENANCE, STATUS_PAGE_PARTIAL_DOWN, UP, MAINTENANCE, DOWN } = require("../../src/util");
const {
STATUS_PAGE_ALL_DOWN,
STATUS_PAGE_ALL_UP,
STATUS_PAGE_MAINTENANCE,
STATUS_PAGE_PARTIAL_DOWN,
UP,
MAINTENANCE,
DOWN,
} = require("../../src/util");
class StatusPage extends BeanModel {
/**
* Like this: { "test-uptime.kuma.pet": "default" }
* @type {{}}
*/
static domainMappingList = { };
static domainMappingList = {};
/**
* Handle responses to RSS pages
@@ -27,9 +34,7 @@ class StatusPage extends BeanModel {
* @returns {Promise<void>}
*/
static async handleStatusPageRSSResponse(response, slug, request) {
let statusPage = await R.findOne("status_page", " slug = ? ", [
slug
]);
let statusPage = await R.findOne("status_page", " slug = ? ", [slug]);
if (statusPage) {
const feedUrl = await StatusPage.buildRSSUrl(slug, request);
@@ -54,9 +59,7 @@ class StatusPage extends BeanModel {
slug = "default";
}
let statusPage = await R.findOne("status_page", " slug = ? ", [
slug
]);
let statusPage = await R.findOne("status_page", " slug = ? ", [slug]);
if (statusPage) {
response.send(await StatusPage.renderHTML(indexHTML, statusPage));
@@ -90,7 +93,7 @@ class StatusPage extends BeanModel {
updated: new Date(), // optional, default = today
});
heartbeats.forEach(heartbeat => {
heartbeats.forEach((heartbeat) => {
feed.addItem({
title: `${heartbeat.name} is down`,
description: `${heartbeat.name} has been down since ${heartbeat.time} UTC`,
@@ -153,9 +156,7 @@ class StatusPage extends BeanModel {
$("meta[name=description]").attr("content", description155);
if (statusPage.icon) {
$("link[rel=icon]")
.attr("href", statusPage.icon)
.removeAttr("type");
$("link[rel=icon]").attr("href", statusPage.icon).removeAttr("type");
$("link[rel=apple-touch-icon]").remove();
}
@@ -168,19 +169,19 @@ class StatusPage extends BeanModel {
}
// OG Meta Tags
let ogTitle = $("<meta property=\"og:title\" content=\"\" />").attr("content", statusPage.title);
let ogTitle = $('<meta property="og:title" content="" />').attr("content", statusPage.title);
head.append(ogTitle);
let ogDescription = $("<meta property=\"og:description\" content=\"\" />").attr("content", description155);
let ogDescription = $('<meta property="og:description" content="" />').attr("content", description155);
head.append(ogDescription);
let ogType = $("<meta property=\"og:type\" content=\"website\" />");
let ogType = $('<meta property="og:type" content="website" />');
head.append(ogType);
// Preload data
// Add jsesc, fix https://github.com/louislam/uptime-kuma/issues/2186
const escapedJSONObject = jsesc(await StatusPage.getStatusPageData(statusPage), {
"isScriptContext": true
isScriptContext: true,
});
const script = $(`
@@ -219,7 +220,7 @@ class StatusPage extends BeanModel {
}
}
if (! hasUp) {
if (!hasUp) {
status = STATUS_PAGE_ALL_DOWN;
}
@@ -267,21 +268,19 @@ class StatusPage extends BeanModel {
// Public Group List
const showTags = !!statusPage.show_tags;
const list = await R.find("group", " public = 1 AND status_page_id = ? ORDER BY weight ", [
statusPage.id
]);
const list = await R.find("group", " public = 1 AND status_page_id = ? ORDER BY weight ", [statusPage.id]);
let heartbeats = [];
for (let groupBean of list) {
let monitorGroup = await groupBean.toPublicJSON(showTags, config?.showCertificateExpiry);
for (const monitor of monitorGroup.monitorList) {
const heartbeat = await R.findOne("heartbeat", "monitor_id = ? ORDER BY time DESC", [ monitor.id ]);
const heartbeat = await R.findOne("heartbeat", "monitor_id = ? ORDER BY time DESC", [monitor.id]);
if (heartbeat) {
heartbeats.push({
...monitor,
status: heartbeat.status,
time: heartbeat.time
time: heartbeat.time,
});
}
}
@@ -292,11 +291,11 @@ class StatusPage extends BeanModel {
let statusDescription = StatusPage.getStatusDescription(status);
// keep only DOWN heartbeats in the RSS feed
heartbeats = heartbeats.filter(heartbeat => heartbeat.status === DOWN);
heartbeats = heartbeats.filter((heartbeat) => heartbeat.status === DOWN);
return {
heartbeats,
statusDescription
statusDescription,
};
}
@@ -309,9 +308,7 @@ class StatusPage extends BeanModel {
const config = await statusPage.toPublicJSON();
// Incident
let incident = await R.findOne("incident", " pin = 1 AND active = 1 AND status_page_id = ? ", [
statusPage.id,
]);
let incident = await R.findOne("incident", " pin = 1 AND active = 1 AND status_page_id = ? ", [statusPage.id]);
if (incident) {
incident = incident.toPublicJSON();
@@ -323,9 +320,7 @@ class StatusPage extends BeanModel {
const publicGroupList = [];
const showTags = !!statusPage.show_tags;
const list = await R.find("group", " public = 1 AND status_page_id = ? ORDER BY weight ", [
statusPage.id
]);
const list = await R.find("group", " public = 1 AND status_page_id = ? ORDER BY weight ", [statusPage.id]);
for (let groupBean of list) {
let monitorGroup = await groupBean.toPublicJSON(showTags, config?.showCertificateExpiry);
@@ -379,16 +374,13 @@ class StatusPage extends BeanModel {
* @returns {Promise<void>}
*/
async updateDomainNameList(domainNameList) {
if (!Array.isArray(domainNameList)) {
throw new Error("Invalid array");
}
let trx = await R.begin();
await trx.exec("DELETE FROM status_page_cname WHERE status_page_id = ?", [
this.id,
]);
await trx.exec("DELETE FROM status_page_cname WHERE status_page_id = ?", [this.id]);
try {
for (let domain of domainNameList) {
@@ -401,9 +393,7 @@ class StatusPage extends BeanModel {
}
// If the domain name is used in another status page, delete it
await trx.exec("DELETE FROM status_page_cname WHERE domain = ?", [
domain,
]);
await trx.exec("DELETE FROM status_page_cname WHERE domain = ?", [domain]);
let mapping = trx.dispense("status_page_cname");
mapping.status_page_id = this.id;
@@ -494,9 +484,7 @@ class StatusPage extends BeanModel {
* @returns {Promise<number>} ID of status page
*/
static async slugToID(slug) {
return await R.getCell("SELECT id FROM status_page WHERE slug = ? ", [
slug
]);
return await R.getCell("SELECT id FROM status_page WHERE slug = ? ", [slug]);
}
/**
@@ -520,21 +508,23 @@ class StatusPage extends BeanModel {
try {
const publicMaintenanceList = [];
let maintenanceIDList = await R.getCol(`
let maintenanceIDList = await R.getCol(
`
SELECT DISTINCT maintenance_id
FROM maintenance_status_page
WHERE status_page_id = ?
`, [ statusPageId ]);
`,
[statusPageId]
);
for (const maintenanceID of maintenanceIDList) {
let maintenance = UptimeKumaServer.getInstance().getMaintenance(maintenanceID);
if (maintenance && await maintenance.isUnderMaintenance()) {
if (maintenance && (await maintenance.isUnderMaintenance())) {
publicMaintenanceList.push(await maintenance.toPublicJSON());
}
}
return publicMaintenanceList;
} catch (error) {
return [];
}
-1
View File
@@ -1,7 +1,6 @@
const { BeanModel } = require("redbean-node/dist/bean-model");
class Tag extends BeanModel {
/**
* Return an object that ready to parse to JSON
* @returns {object} Object ready to parse
+9 -10
View File
@@ -15,7 +15,7 @@ class User extends BeanModel {
static async resetPassword(userID, newPassword) {
await R.exec("UPDATE `user` SET password = ? WHERE id = ? ", [
await passwordHash.generate(newPassword),
userID
userID,
]);
}
@@ -27,10 +27,7 @@ class User extends BeanModel {
async resetPassword(newPassword) {
const hashedPassword = await passwordHash.generate(newPassword);
await R.exec("UPDATE `user` SET password = ? WHERE id = ? ", [
hashedPassword,
this.id
]);
await R.exec("UPDATE `user` SET password = ? WHERE id = ? ", [hashedPassword, this.id]);
this.password = hashedPassword;
}
@@ -42,12 +39,14 @@ class User extends BeanModel {
* @returns {string} the JsonWebToken as a string
*/
static createJWT(user, jwtSecret) {
return jwt.sign({
username: user.username,
h: shake256(user.password, SHAKE256_LENGTH),
}, jwtSecret);
return jwt.sign(
{
username: user.username,
h: shake256(user.password, SHAKE256_LENGTH),
},
jwtSecret
);
}
}
module.exports = User;