mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-06-07 21:42:34 +02:00
feat(monitor-checks): add should and should not dropdown
This commit is contained in:
parent
786db6dada
commit
eb810ec7c7
7 changed files with 235 additions and 112 deletions
|
@ -6,11 +6,25 @@ dayjs.extend(utc);
|
||||||
dayjs.extend(timezone);
|
dayjs.extend(timezone);
|
||||||
const axios = require("axios");
|
const axios = require("axios");
|
||||||
const { Prometheus } = require("../prometheus");
|
const { Prometheus } = require("../prometheus");
|
||||||
const { debug, UP, DOWN, PENDING, flipStatus, TimeLogger, MONITOR_CHECK_SELECTOR_TYPES,
|
const {
|
||||||
|
debug,
|
||||||
|
UP,
|
||||||
|
DOWN,
|
||||||
|
PENDING,
|
||||||
|
flipStatus,
|
||||||
|
TimeLogger,
|
||||||
|
MONITOR_CHECK_HTTP_CODE_TYPES,
|
||||||
|
MONITOR_CHECK_SELECTOR_TYPES,
|
||||||
HTTP_STATUS_CODE_SHOULD_EQUAL,
|
HTTP_STATUS_CODE_SHOULD_EQUAL,
|
||||||
RESPONSE_SHOULD_CONTAIN_TEXT
|
RESPONSE_SHOULD_CONTAIN_TEXT,
|
||||||
} = require("../../src/util");
|
} = require("../../src/util");
|
||||||
const { tcping, ping, dnsResolve, checkCertificate, getTotalClientInRoom } = require("../util-server");
|
const {
|
||||||
|
tcping,
|
||||||
|
ping,
|
||||||
|
dnsResolve,
|
||||||
|
checkCertificate,
|
||||||
|
getTotalClientInRoom,
|
||||||
|
} = require("../util-server");
|
||||||
const { R } = require("redbean-node");
|
const { R } = require("redbean-node");
|
||||||
const { BeanModel } = require("redbean-node/dist/bean-model");
|
const { BeanModel } = require("redbean-node/dist/bean-model");
|
||||||
const { Notification } = require("../notification");
|
const { Notification } = require("../notification");
|
||||||
|
@ -111,7 +125,7 @@ class Monitor extends BeanModel {
|
||||||
// undefined if not https
|
// undefined if not https
|
||||||
let tlsInfo = undefined;
|
let tlsInfo = undefined;
|
||||||
|
|
||||||
if (! previousBeat) {
|
if (!previousBeat) {
|
||||||
previousBeat = await R.findOne("heartbeat", " monitor_id = ? ORDER BY time DESC", [
|
previousBeat = await R.findOne("heartbeat", " monitor_id = ? ORDER BY time DESC", [
|
||||||
this.id,
|
this.id,
|
||||||
]);
|
]);
|
||||||
|
@ -129,7 +143,7 @@ class Monitor extends BeanModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Duration
|
// Duration
|
||||||
if (! isFirstBeat) {
|
if (!isFirstBeat) {
|
||||||
bean.duration = dayjs(bean.time).diff(dayjs(previousBeat.time), "second");
|
bean.duration = dayjs(bean.time).diff(dayjs(previousBeat.time), "second");
|
||||||
} else {
|
} else {
|
||||||
bean.duration = 0;
|
bean.duration = 0;
|
||||||
|
@ -148,7 +162,7 @@ class Monitor extends BeanModel {
|
||||||
},
|
},
|
||||||
httpsAgent: new https.Agent({
|
httpsAgent: new https.Agent({
|
||||||
maxCachedSessions: 0, // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940)
|
maxCachedSessions: 0, // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940)
|
||||||
rejectUnauthorized: ! this.getIgnoreTls(),
|
rejectUnauthorized: !this.getIgnoreTls(),
|
||||||
}),
|
}),
|
||||||
maxRedirects: this.maxredirects,
|
maxRedirects: this.maxredirects,
|
||||||
validateStatus: undefined,
|
validateStatus: undefined,
|
||||||
|
@ -216,7 +230,7 @@ class Monitor extends BeanModel {
|
||||||
if (this.dnsLastResult !== dnsMessage) {
|
if (this.dnsLastResult !== dnsMessage) {
|
||||||
R.exec("UPDATE `monitor` SET dns_last_result = ? WHERE id = ? ", [
|
R.exec("UPDATE `monitor` SET dns_last_result = ? WHERE id = ? ", [
|
||||||
dnsMessage,
|
dnsMessage,
|
||||||
this.id
|
this.id,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,7 +241,7 @@ class Monitor extends BeanModel {
|
||||||
|
|
||||||
let heartbeatCount = await R.count("heartbeat", " monitor_id = ? AND time > ? ", [
|
let heartbeatCount = await R.count("heartbeat", " monitor_id = ? AND time > ? ", [
|
||||||
this.id,
|
this.id,
|
||||||
time
|
time,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
debug("heartbeatCount" + heartbeatCount + " " + time);
|
debug("heartbeatCount" + heartbeatCount + " " + time);
|
||||||
|
@ -341,7 +355,7 @@ class Monitor extends BeanModel {
|
||||||
|
|
||||||
previousBeat = bean;
|
previousBeat = bean;
|
||||||
|
|
||||||
if (! this.isStop) {
|
if (!this.isStop) {
|
||||||
this.heartbeatInterval = setTimeout(beat, beatInterval * 1000);
|
this.heartbeatInterval = setTimeout(beat, beatInterval * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,9 +432,11 @@ class Monitor extends BeanModel {
|
||||||
let avgPing = parseInt(await R.getCell(`
|
let avgPing = parseInt(await R.getCell(`
|
||||||
SELECT AVG(ping)
|
SELECT AVG(ping)
|
||||||
FROM heartbeat
|
FROM heartbeat
|
||||||
WHERE time > DATETIME('now', ? || ' hours')
|
WHERE time
|
||||||
AND ping IS NOT NULL
|
> DATETIME('now'
|
||||||
AND monitor_id = ? `, [
|
, ? || ' hours')
|
||||||
|
AND ping IS NOT NULL
|
||||||
|
AND monitor_id = ? `, [
|
||||||
-duration,
|
-duration,
|
||||||
monitorID,
|
monitorID,
|
||||||
]));
|
]));
|
||||||
|
@ -454,30 +470,31 @@ class Monitor extends BeanModel {
|
||||||
// e.g. If the last beat's duration is bigger that the 24hrs window, it will use the duration between the (beat time - window margin) (THEN case in SQL)
|
// e.g. If the last beat's duration is bigger that the 24hrs window, it will use the duration between the (beat time - window margin) (THEN case in SQL)
|
||||||
let result = await R.getRow(`
|
let result = await R.getRow(`
|
||||||
SELECT
|
SELECT
|
||||||
-- SUM all duration, also trim off the beat out of time window
|
-- SUM all duration, also trim off the beat out of time window
|
||||||
SUM(
|
SUM(
|
||||||
CASE
|
CASE
|
||||||
WHEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400 < duration
|
WHEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400 < duration
|
||||||
THEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400
|
THEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400
|
||||||
ELSE duration
|
ELSE duration
|
||||||
END
|
END
|
||||||
) AS total_duration,
|
) AS total_duration,
|
||||||
|
|
||||||
-- SUM all uptime duration, also trim off the beat out of time window
|
-- SUM all uptime duration, also trim off the beat out of time window
|
||||||
SUM(
|
SUM(
|
||||||
CASE
|
CASE
|
||||||
WHEN (status = 1)
|
WHEN (status = 1)
|
||||||
THEN
|
THEN
|
||||||
CASE
|
CASE
|
||||||
WHEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400 < duration
|
WHEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400 < duration
|
||||||
THEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400
|
THEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400
|
||||||
ELSE duration
|
ELSE duration
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
) AS uptime_duration
|
) AS uptime_duration
|
||||||
FROM heartbeat
|
FROM heartbeat
|
||||||
WHERE time > ?
|
WHERE time
|
||||||
AND monitor_id = ?
|
> ?
|
||||||
|
AND monitor_id = ?
|
||||||
`, [
|
`, [
|
||||||
startTime, startTime, startTime, startTime, startTime,
|
startTime, startTime, startTime, startTime, startTime,
|
||||||
monitorID,
|
monitorID,
|
||||||
|
@ -497,7 +514,7 @@ class Monitor extends BeanModel {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Handle new monitor with only one beat, because the beat's duration = 0
|
// Handle new monitor with only one beat, because the beat's duration = 0
|
||||||
let status = parseInt(await R.getCell("SELECT `status` FROM heartbeat WHERE monitor_id = ?", [ monitorID ]));
|
let status = parseInt(await R.getCell("SELECT `status` FROM heartbeat WHERE monitor_id = ?", [monitorID]));
|
||||||
|
|
||||||
if (status === UP) {
|
if (status === UP) {
|
||||||
uptime = 1;
|
uptime = 1;
|
||||||
|
@ -523,10 +540,10 @@ class Monitor extends BeanModel {
|
||||||
const checks = await R.getAll("SELECT mc.type, mc.value FROM monitor_checks mc WHERE mc.monitor_id = ?", [this.id]);
|
const checks = await R.getAll("SELECT mc.type, mc.value FROM monitor_checks mc WHERE mc.monitor_id = ?", [this.id]);
|
||||||
|
|
||||||
checks.forEach(check => {
|
checks.forEach(check => {
|
||||||
if (MONITOR_CHECK_SELECTOR_TYPES.includes(check.type) && typeof check.value === "string" && check.value.startsWith("{")) {
|
if (MONITOR_CHECK_HTTP_CODE_TYPES.includes(check.type) && typeof check.value === "string" && check.value.startsWith("[")) {
|
||||||
check.value = JSON.parse(check.value);
|
check.value = JSON.parse(check.value);
|
||||||
}
|
}
|
||||||
if (check.type === "HTTP_STATUS_CODE_SHOULD_EQUAL" && typeof check.value === "string" && check.value.startsWith("[")) {
|
if (MONITOR_CHECK_SELECTOR_TYPES.includes(check.type) && typeof check.value === "string" && check.value.startsWith("{")) {
|
||||||
check.value = JSON.parse(check.value);
|
check.value = JSON.parse(check.value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -16,6 +16,15 @@ function validateMonitorChecks(res, checks, bean) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "HTTP_STATUS_CODE_SHOULD_NOT_EQUAL":
|
||||||
|
if (!checkStatusCode(res.status, check.value)) {
|
||||||
|
bean.msg += `, status does not match '${check.value}'`;
|
||||||
|
bean.status = UP;
|
||||||
|
} else {
|
||||||
|
throw new Error(bean.msg + ", but status code does match " + check.value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case "RESPONSE_SHOULD_CONTAIN_TEXT":
|
case "RESPONSE_SHOULD_CONTAIN_TEXT":
|
||||||
if (responseText.includes(check.value)) {
|
if (responseText.includes(check.value)) {
|
||||||
bean.msg += `, response contains '${check.value}'`;
|
bean.msg += `, response contains '${check.value}'`;
|
||||||
|
|
|
@ -1,36 +1,32 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="monitor-check mb-4">
|
<div class="monitor-check mb-4">
|
||||||
<div>
|
<div>
|
||||||
<select id="type" :value="monitorCheck.type" :class="{'form-select': true, 'mb-1': !!monitorCheck.type}" @input="changeType($event.target.value)" required>
|
<div class="side-by-side">
|
||||||
<option value="HTTP_STATUS_CODE_SHOULD_EQUAL">
|
<select id="invert-check" :value="invertedTypeOption" :class="{'form-select': true, 'mb-1': !!monitorCheck.type, 'me-1': true}"
|
||||||
{{ $t("MonitorCheckTypeHttpStatusCodeShouldEqual") }}
|
@input="changeTypeInversion($event.target.value)" required>
|
||||||
</option>
|
<option value="SHOULD">{{ $t("MonitorCheckTypeShould") }}</option>
|
||||||
<option value="RESPONSE_SHOULD_CONTAIN_TEXT">
|
<option value="SHOULD_NOT">{{ $t("MonitorCheckTypeShouldNot") }}</option>
|
||||||
{{ $t("MonitorCheckTypeResponseShouldContainText") }}
|
</select>
|
||||||
</option>
|
<select id="type" :value="monitorType" :class="{'form-select': true, 'mb-1': !!monitorCheck.type}"
|
||||||
<option value="RESPONSE_SHOULD_NOT_CONTAIN_TEXT">
|
@input="changeType($event.target.value)" required>
|
||||||
{{ $t("MonitorCheckTypeResponseShouldNotContainText") }}
|
<option value="HTTP_STATUS_CODE_SHOULD_EQUAL">
|
||||||
</option>
|
{{ $t("MonitorCheckTypeHttpStatusCodeShouldEqual") }}
|
||||||
<option value="RESPONSE_SHOULD_MATCH_REGEX">
|
</option>
|
||||||
{{ $t("MonitorCheckTypeResponseShouldMatchRegex") }}
|
<option value="RESPONSE_SHOULD_CONTAIN_TEXT">
|
||||||
</option>
|
{{ $t("MonitorCheckTypeResponseShouldContainText") }}
|
||||||
<option value="RESPONSE_SHOULD_NOT_MATCH_REGEX">
|
</option>
|
||||||
{{ $t("MonitorCheckTypeResponseShouldNotMatchRegex") }}
|
<option value="RESPONSE_SHOULD_MATCH_REGEX">
|
||||||
</option>
|
{{ $t("MonitorCheckTypeResponseShouldMatchRegex") }}
|
||||||
<option value="RESPONSE_SELECTOR_SHOULD_EQUAL">
|
</option>
|
||||||
{{ $t("MonitorCheckTypeResponseSelectorShouldEqual") }}
|
<option value="RESPONSE_SELECTOR_SHOULD_EQUAL">
|
||||||
</option>
|
{{ $t("MonitorCheckTypeResponseSelectorShouldEqual") }}
|
||||||
<option value="RESPONSE_SELECTOR_SHOULD_NOT_EQUAL">
|
</option>
|
||||||
{{ $t("MonitorCheckTypeResponseSelectorShouldNotEqual") }}
|
<option value="RESPONSE_SELECTOR_SHOULD_MATCH_REGEX">
|
||||||
</option>
|
{{ $t("MonitorCheckTypeResponseSelectorShouldMatchRegex") }}
|
||||||
<option value="RESPONSE_SELECTOR_SHOULD_MATCH_REGEX">
|
</option>
|
||||||
{{ $t("MonitorCheckTypeResponseSelectorShouldMatchRegex") }}
|
</select>
|
||||||
</option>
|
</div>
|
||||||
<option value="RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX">
|
<div v-if="monitorType === 'HTTP_STATUS_CODE_SHOULD_EQUAL'">
|
||||||
{{ $t("MonitorCheckTypeResponseSelectorShouldNotMatchRegex") }}
|
|
||||||
</option>
|
|
||||||
</select>
|
|
||||||
<div v-if="monitorCheck.type === 'HTTP_STATUS_CODE_SHOULD_EQUAL'">
|
|
||||||
<VueMultiselect
|
<VueMultiselect
|
||||||
id="acceptedStatusCodes"
|
id="acceptedStatusCodes"
|
||||||
:options="acceptedStatusCodeOptions"
|
:options="acceptedStatusCodeOptions"
|
||||||
|
@ -46,29 +42,30 @@
|
||||||
@update:model-value="changeValue"
|
@update:model-value="changeValue"
|
||||||
></VueMultiselect>
|
></VueMultiselect>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="monitorCheck.type === 'RESPONSE_SHOULD_CONTAIN_TEXT' || monitorCheck.type === 'RESPONSE_SHOULD_NOT_CONTAIN_TEXT'">
|
<div v-if="monitorType === 'RESPONSE_SHOULD_CONTAIN_TEXT'">
|
||||||
<input :value="monitorCheck.value" type="text" class="form-control" required :placeholder="$t('MonitorCheckValuePlaceholder')" @input="changeValue($event.target.value)">
|
<input :value="monitorCheck.value" type="text" class="form-control" required :placeholder="$t('MonitorCheckValuePlaceholder')"
|
||||||
|
@input="changeValue($event.target.value)">
|
||||||
</div>
|
</div>
|
||||||
<div v-if="monitorCheck.type === 'RESPONSE_SHOULD_MATCH_REGEX' || monitorCheck.type === 'RESPONSE_SHOULD_NOT_MATCH_REGEX'">
|
<div v-if="monitorType === 'RESPONSE_SHOULD_MATCH_REGEX'">
|
||||||
<input type="text" class="form-control" required :value="monitorCheck.value"
|
<input type="text" class="form-control" required :value="monitorCheck.value"
|
||||||
:placeholder="$t('Regexp, Example: [a-z0-9.]+@gmail\.com')" @input="changeValue($event.target.value)"
|
:placeholder="$t('Regexp, Example: [a-z0-9.]+@gmail\.com')" @input="changeValue($event.target.value)"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div v-if="monitorType === 'RESPONSE_SELECTOR_SHOULD_EQUAL'">
|
||||||
v-if="monitorCheck.type === 'RESPONSE_SELECTOR_SHOULD_EQUAL' || monitorCheck.type === 'RESPONSE_SELECTOR_SHOULD_NOT_EQUAL'"
|
<input :value="monitorCheck?.value?.selectorPath || ''" type="text" class="form-control mb-1" required
|
||||||
>
|
:placeholder="$t('Selector, Example: customer.address.street')"
|
||||||
<input :value="monitorCheck?.value?.selectorPath || ''" type="text" class="form-control mb-1" required :placeholder="$t('Selector, Example: customer.address.street')"
|
|
||||||
@input="changeSelectorPath($event.target.value)"
|
@input="changeSelectorPath($event.target.value)"
|
||||||
>
|
>
|
||||||
<input :value="monitorCheck?.value?.selectorValue || ''" type="text" class="form-control" required :placeholder="$t('Value, Example: First street')" @input="changeSelectorValue($event.target.value)">
|
<input :value="monitorCheck?.value?.selectorValue || ''" type="text" class="form-control" required
|
||||||
|
:placeholder="$t('Value, Example: First street')" @input="changeSelectorValue($event.target.value)">
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div v-if="monitorType === 'RESPONSE_SELECTOR_SHOULD_MATCH_REGEX'">
|
||||||
v-if="monitorCheck.type === 'RESPONSE_SELECTOR_SHOULD_MATCH_REGEX' || monitorCheck.type === 'RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX'"
|
<input :value="monitorCheck?.value?.selectorPath || ''" type="text" class="form-control mb-1" required
|
||||||
>
|
:placeholder="$t('Selector, Example: customer.contactInfo.email')"
|
||||||
<input :value="monitorCheck?.value?.selectorPath || ''" type="text" class="form-control mb-1" required :placeholder="$t('Selector, Example: customer.contactInfo.email')"
|
|
||||||
@input="changeSelectorPath($event.target.value)"
|
@input="changeSelectorPath($event.target.value)"
|
||||||
>
|
>
|
||||||
<input :value="monitorCheck?.value?.selectorValue || ''" type="text" class="form-control" required :placeholder="$t('Regexp, Example: [a-z0-9.]+@gmail\.com')"
|
<input :value="monitorCheck?.value?.selectorValue || ''" type="text" class="form-control" required
|
||||||
|
:placeholder="$t('Regexp, Example: [a-z0-9.]+@gmail\.com')"
|
||||||
@input="changeSelectorValue($event.target.value)"
|
@input="changeSelectorValue($event.target.value)"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
@ -81,7 +78,14 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import VueMultiselect from "vue-multiselect";
|
import VueMultiselect from "vue-multiselect";
|
||||||
import { MONITOR_CHECK_SELECTOR_TYPES, MONITOR_CHECK_STRING_TYPES } from "../util.ts";
|
import {
|
||||||
|
MONITOR_CHECK_INVERTED_TYPES,
|
||||||
|
MONITOR_CHECK_SELECTOR_TYPES,
|
||||||
|
MONITOR_CHECK_STRING_TYPES,
|
||||||
|
MONITOR_CHECK_SHOULD,
|
||||||
|
MONITOR_CHECK_SHOULD_NOT,
|
||||||
|
MONITOR_CHECK_MAP_NORMAL_TO_INVERTED, MONITOR_CHECK_MAP_INVERTED_TO_NORMAL, MONITOR_CHECK_HTTP_CODE_TYPES,
|
||||||
|
} from "../util.ts";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
|
@ -100,6 +104,10 @@ export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
acceptedStatusCodeOptions: [],
|
acceptedStatusCodeOptions: [],
|
||||||
|
// Contains SHOULD or SHOULD_NOT
|
||||||
|
invertedTypeOption: MONITOR_CHECK_SHOULD,
|
||||||
|
// Always contains the normal type (never the NOT variant)
|
||||||
|
monitorType: undefined,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -116,13 +124,33 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.acceptedStatusCodeOptions = acceptedStatusCodeOptions;
|
this.acceptedStatusCodeOptions = acceptedStatusCodeOptions;
|
||||||
|
|
||||||
|
if (this.monitorCheck.type) {
|
||||||
|
this.invertedTypeOption = MONITOR_CHECK_INVERTED_TYPES.includes(this.monitorCheck.type) ? MONITOR_CHECK_SHOULD_NOT : MONITOR_CHECK_SHOULD;
|
||||||
|
this.monitorType = MONITOR_CHECK_MAP_INVERTED_TO_NORMAL[this.monitorCheck.type] || this.monitorCheck.type;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
deleteMonitorCheck() {
|
deleteMonitorCheck() {
|
||||||
this.$emit("delete");
|
this.$emit("delete");
|
||||||
},
|
},
|
||||||
|
changeTypeInversion(inversionType) {
|
||||||
|
this.invertedTypeOption = inversionType;
|
||||||
|
this.emitType();
|
||||||
|
},
|
||||||
changeType(type) {
|
changeType(type) {
|
||||||
if (MONITOR_CHECK_STRING_TYPES.includes(type) && MONITOR_CHECK_STRING_TYPES.includes(this.monitorCheck.type) ||
|
this.monitorType = type;
|
||||||
|
this.emitType();
|
||||||
|
},
|
||||||
|
// Combine invertedTypeOption with monitorType to produce the combined this.monitorCheck.type
|
||||||
|
emitType() {
|
||||||
|
if (!this.monitorType) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const type = this.invertedTypeOption === MONITOR_CHECK_SHOULD ? this.monitorType : MONITOR_CHECK_MAP_NORMAL_TO_INVERTED[this.monitorType];
|
||||||
|
|
||||||
|
if (MONITOR_CHECK_HTTP_CODE_TYPES.includes(type) && MONITOR_CHECK_HTTP_CODE_TYPES.includes(this.monitorCheck.type) ||
|
||||||
|
MONITOR_CHECK_STRING_TYPES.includes(type) && MONITOR_CHECK_STRING_TYPES.includes(this.monitorCheck.type) ||
|
||||||
MONITOR_CHECK_SELECTOR_TYPES.includes(type) && MONITOR_CHECK_SELECTOR_TYPES.includes(this.monitorCheck.type)) {
|
MONITOR_CHECK_SELECTOR_TYPES.includes(type) && MONITOR_CHECK_SELECTOR_TYPES.includes(this.monitorCheck.type)) {
|
||||||
// Check value stays same type (string => string or object => object)
|
// Check value stays same type (string => string or object => object)
|
||||||
this.$emit("change", {
|
this.$emit("change", {
|
||||||
|
@ -133,7 +161,7 @@ export default {
|
||||||
// Check value switches (string => object or object => string)
|
// Check value switches (string => object or object => string)
|
||||||
this.$emit("change", {
|
this.$emit("change", {
|
||||||
type,
|
type,
|
||||||
value: undefined
|
value: undefined,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -166,29 +194,51 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import "../assets/vars.scss";
|
@import "../assets/vars.scss";
|
||||||
|
|
||||||
.monitor-check {
|
.monitor-check {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
input,
|
> div:first-child {
|
||||||
select {
|
width: 100%;
|
||||||
border-radius: 19px 0 0 19px;
|
}
|
||||||
|
|
||||||
|
.side-by-side {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
> select:first-child {
|
||||||
|
width: 40%;
|
||||||
|
|
||||||
|
+ select {
|
||||||
|
border-radius: 0;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
select {
|
||||||
|
border-radius: 19px 0 0 19px;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
margin-left: 0.25rem;
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
border-radius: 0 19px 19px 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
button {
|
|
||||||
margin-left: 0.25rem;
|
|
||||||
padding-left: 15px;
|
|
||||||
padding-right: 15px;
|
|
||||||
border-radius: 0 19px 19px 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.monitor-check {
|
.monitor-check {
|
||||||
.multiselect__tags {
|
.multiselect__tags {
|
||||||
border-radius: 19px 0 0 19px;
|
border-radius: 19px 0 0 19px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -194,15 +194,13 @@ export default {
|
||||||
"pushbullet": "Pushbullet",
|
"pushbullet": "Pushbullet",
|
||||||
"line": "Line Messenger",
|
"line": "Line Messenger",
|
||||||
"mattermost": "Mattermost",
|
"mattermost": "Mattermost",
|
||||||
MonitorCheckTypeHttpStatusCodeShouldEqual: "HTTP status code should equal",
|
MonitorCheckTypeShould: "Should",
|
||||||
MonitorCheckTypeResponseShouldContainText: "Response should contain text",
|
MonitorCheckTypeShouldNot: "Should not",
|
||||||
MonitorCheckTypeResponseShouldNotContainText: "Response should not contain text",
|
MonitorCheckTypeHttpStatusCodeShouldEqual: "equal status code",
|
||||||
MonitorCheckTypeResponseShouldMatchRegex: "Response should match regex",
|
MonitorCheckTypeResponseShouldContainText: "contain",
|
||||||
MonitorCheckTypeResponseShouldNotMatchRegex: "Response should not match regex",
|
MonitorCheckTypeResponseShouldMatchRegex: "match regex",
|
||||||
MonitorCheckTypeResponseSelectorShouldEqual: "Response selector should equal",
|
MonitorCheckTypeResponseSelectorShouldEqual: "equal (JSON selector)",
|
||||||
MonitorCheckTypeResponseSelectorShouldNotEqual: "Response selector should not equal",
|
MonitorCheckTypeResponseSelectorShouldMatchRegex: "match regex (JSON selector)",
|
||||||
MonitorCheckTypeResponseSelectorShouldMatchRegex: "Response selector should match regex",
|
|
||||||
MonitorCheckTypeResponseSelectorShouldNotMatchRegex: "Response selector should not match regex",
|
|
||||||
MonitorCheckValuePlaceholder: "Value",
|
MonitorCheckValuePlaceholder: "Value",
|
||||||
MonitorCheckSelectorPathPlaceholder: "Selector, Example: customer.address.street",
|
MonitorCheckSelectorPathPlaceholder: "Selector, Example: customer.address.street",
|
||||||
MonitorCheckSelectorValuePlaceholder: "Value, Example: First street",
|
MonitorCheckSelectorValuePlaceholder: "Value, Example: First street",
|
||||||
|
|
|
@ -195,15 +195,13 @@ export default {
|
||||||
pushbullet: "Pushbullet",
|
pushbullet: "Pushbullet",
|
||||||
line: "Line Messenger",
|
line: "Line Messenger",
|
||||||
mattermost: "Mattermost",
|
mattermost: "Mattermost",
|
||||||
MonitorCheckTypeHttpStatusCodeShouldEqual: "HTTP status code moet gelijk zijn aan",
|
MonitorCheckTypeShould: "Moet",
|
||||||
MonitorCheckTypeResponseShouldContainText: "Response moet tekst bevatten",
|
MonitorCheckTypeShouldNot: "Mag niet",
|
||||||
MonitorCheckTypeResponseShouldNotContainText: "Response mag tekst niet bevatten",
|
MonitorCheckTypeHttpStatusCodeShouldEqual: "gelijk aan status code",
|
||||||
MonitorCheckTypeResponseShouldMatchRegex: "Response moet overeenkomen met regex",
|
MonitorCheckTypeResponseShouldContainText: "bevatten",
|
||||||
MonitorCheckTypeResponseShouldNotMatchRegex: "Response mag niet overeenkomen met regex",
|
MonitorCheckTypeResponseShouldMatchRegex: "overeenkomen met regex",
|
||||||
MonitorCheckTypeResponseSelectorShouldEqual: "Response selectie moet gelijk zijn aan",
|
MonitorCheckTypeResponseSelectorShouldEqual: "gelijk zijn (JSON selectie)",
|
||||||
MonitorCheckTypeResponseSelectorShouldNotEqual: "Response selectie mag niet gelijk zijn aan",
|
MonitorCheckTypeResponseSelectorShouldMatchRegex: "overeenkomen met regex (JSON selectie)",
|
||||||
MonitorCheckTypeResponseSelectorShouldMatchRegex: "Response selectie moet overeenkomen met regex",
|
|
||||||
MonitorCheckTypeResponseSelectorShouldNotMatchRegex: "Response selecte mag niet overeenkomen met regex",
|
|
||||||
MonitorCheckValuePlaceholder: "Waarde",
|
MonitorCheckValuePlaceholder: "Waarde",
|
||||||
MonitorCheckSelectorPathPlaceholder: "Selectie, Voorbeeld: klant.adres.straat",
|
MonitorCheckSelectorPathPlaceholder: "Selectie, Voorbeeld: klant.adres.straat",
|
||||||
MonitorCheckSelectorValuePlaceholder: "Waarde, Voorbeeld: Hogestraat",
|
MonitorCheckSelectorValuePlaceholder: "Waarde, Voorbeeld: Hogestraat",
|
||||||
|
|
35
src/util.js
35
src/util.js
|
@ -7,7 +7,7 @@
|
||||||
// Backend uses the compiled file util.js
|
// Backend uses the compiled file util.js
|
||||||
// Frontend uses util.ts
|
// Frontend uses util.ts
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.genSecret = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
|
exports.genSecret = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.MONITOR_CHECK_MAP_INVERTED_TO_NORMAL = exports.MONITOR_CHECK_MAP_NORMAL_TO_INVERTED = exports.MONITOR_CHECK_INVERTED_TYPES = exports.MONITOR_CHECK_SELECTOR_TYPES = exports.MONITOR_CHECK_STRING_TYPES = exports.MONITOR_CHECK_HTTP_CODE_TYPES = exports.RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX = exports.RESPONSE_SELECTOR_SHOULD_MATCH_REGEX = exports.RESPONSE_SELECTOR_SHOULD_NOT_EQUAL = exports.RESPONSE_SELECTOR_SHOULD_EQUAL = exports.RESPONSE_SHOULD_NOT_MATCH_REGEX = exports.RESPONSE_SHOULD_MATCH_REGEX = exports.RESPONSE_SHOULD_NOT_CONTAIN_TEXT = exports.RESPONSE_SHOULD_CONTAIN_TEXT = exports.HTTP_STATUS_CODE_SHOULD_NOT_EQUAL = exports.HTTP_STATUS_CODE_SHOULD_EQUAL = exports.MONITOR_CHECK_SHOULD_NOT = exports.MONITOR_CHECK_SHOULD = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
|
||||||
const _dayjs = require("dayjs");
|
const _dayjs = require("dayjs");
|
||||||
const dayjs = _dayjs;
|
const dayjs = _dayjs;
|
||||||
exports.isDev = process.env.NODE_ENV === "development";
|
exports.isDev = process.env.NODE_ENV === "development";
|
||||||
|
@ -18,8 +18,37 @@ exports.PENDING = 2;
|
||||||
exports.STATUS_PAGE_ALL_DOWN = 0;
|
exports.STATUS_PAGE_ALL_DOWN = 0;
|
||||||
exports.STATUS_PAGE_ALL_UP = 1;
|
exports.STATUS_PAGE_ALL_UP = 1;
|
||||||
exports.STATUS_PAGE_PARTIAL_DOWN = 2;
|
exports.STATUS_PAGE_PARTIAL_DOWN = 2;
|
||||||
exports.MONITOR_CHECK_STRING_TYPES = ["HTTP_STATUS_CODE_SHOULD_EQUAL", "RESPONSE_SHOULD_CONTAIN_TEXT", "RESPONSE_SHOULD_NOT_CONTAIN_TEXT", "RESPONSE_SHOULD_MATCH_REGEX", "RESPONSE_SHOULD_NOT_MATCH_REGEX"];
|
// Monitor check types
|
||||||
exports.MONITOR_CHECK_SELECTOR_TYPES = ["RESPONSE_SELECTOR_SHOULD_EQUAL", "RESPONSE_SELECTOR_SHOULD_NOT_EQUAL", "RESPONSE_SELECTOR_SHOULD_MATCH_REGEX", "RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX"];
|
exports.MONITOR_CHECK_SHOULD = "SHOULD";
|
||||||
|
exports.MONITOR_CHECK_SHOULD_NOT = "SHOULD_NOT";
|
||||||
|
exports.HTTP_STATUS_CODE_SHOULD_EQUAL = "HTTP_STATUS_CODE_SHOULD_EQUAL";
|
||||||
|
exports.HTTP_STATUS_CODE_SHOULD_NOT_EQUAL = "HTTP_STATUS_CODE_SHOULD_NOT_EQUAL";
|
||||||
|
exports.RESPONSE_SHOULD_CONTAIN_TEXT = "RESPONSE_SHOULD_CONTAIN_TEXT";
|
||||||
|
exports.RESPONSE_SHOULD_NOT_CONTAIN_TEXT = "RESPONSE_SHOULD_NOT_CONTAIN_TEXT";
|
||||||
|
exports.RESPONSE_SHOULD_MATCH_REGEX = "RESPONSE_SHOULD_MATCH_REGEX";
|
||||||
|
exports.RESPONSE_SHOULD_NOT_MATCH_REGEX = "RESPONSE_SHOULD_NOT_MATCH_REGEX";
|
||||||
|
exports.RESPONSE_SELECTOR_SHOULD_EQUAL = "RESPONSE_SELECTOR_SHOULD_EQUAL";
|
||||||
|
exports.RESPONSE_SELECTOR_SHOULD_NOT_EQUAL = "RESPONSE_SELECTOR_SHOULD_NOT_EQUAL";
|
||||||
|
exports.RESPONSE_SELECTOR_SHOULD_MATCH_REGEX = "RESPONSE_SELECTOR_SHOULD_MATCH_REGEX";
|
||||||
|
exports.RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX = "RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX";
|
||||||
|
exports.MONITOR_CHECK_HTTP_CODE_TYPES = [exports.HTTP_STATUS_CODE_SHOULD_EQUAL, exports.HTTP_STATUS_CODE_SHOULD_NOT_EQUAL];
|
||||||
|
exports.MONITOR_CHECK_STRING_TYPES = [exports.RESPONSE_SHOULD_CONTAIN_TEXT, exports.RESPONSE_SHOULD_NOT_CONTAIN_TEXT, exports.RESPONSE_SHOULD_MATCH_REGEX, exports.RESPONSE_SHOULD_NOT_MATCH_REGEX];
|
||||||
|
exports.MONITOR_CHECK_SELECTOR_TYPES = [exports.RESPONSE_SELECTOR_SHOULD_EQUAL, exports.RESPONSE_SELECTOR_SHOULD_NOT_EQUAL, exports.RESPONSE_SELECTOR_SHOULD_MATCH_REGEX, exports.RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX];
|
||||||
|
exports.MONITOR_CHECK_INVERTED_TYPES = [exports.HTTP_STATUS_CODE_SHOULD_NOT_EQUAL, exports.RESPONSE_SHOULD_NOT_CONTAIN_TEXT, exports.RESPONSE_SHOULD_NOT_MATCH_REGEX, exports.RESPONSE_SELECTOR_SHOULD_NOT_EQUAL, exports.RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX];
|
||||||
|
exports.MONITOR_CHECK_MAP_NORMAL_TO_INVERTED = {
|
||||||
|
[exports.HTTP_STATUS_CODE_SHOULD_EQUAL]: exports.HTTP_STATUS_CODE_SHOULD_NOT_EQUAL,
|
||||||
|
[exports.RESPONSE_SHOULD_CONTAIN_TEXT]: exports.RESPONSE_SHOULD_NOT_CONTAIN_TEXT,
|
||||||
|
[exports.RESPONSE_SHOULD_MATCH_REGEX]: exports.RESPONSE_SHOULD_NOT_MATCH_REGEX,
|
||||||
|
[exports.RESPONSE_SELECTOR_SHOULD_EQUAL]: exports.RESPONSE_SELECTOR_SHOULD_NOT_EQUAL,
|
||||||
|
[exports.RESPONSE_SELECTOR_SHOULD_MATCH_REGEX]: exports.RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX,
|
||||||
|
};
|
||||||
|
exports.MONITOR_CHECK_MAP_INVERTED_TO_NORMAL = {
|
||||||
|
[exports.HTTP_STATUS_CODE_SHOULD_NOT_EQUAL]: exports.HTTP_STATUS_CODE_SHOULD_EQUAL,
|
||||||
|
[exports.RESPONSE_SHOULD_NOT_CONTAIN_TEXT]: exports.RESPONSE_SHOULD_CONTAIN_TEXT,
|
||||||
|
[exports.RESPONSE_SHOULD_NOT_MATCH_REGEX]: exports.RESPONSE_SHOULD_MATCH_REGEX,
|
||||||
|
[exports.RESPONSE_SELECTOR_SHOULD_NOT_EQUAL]: exports.RESPONSE_SELECTOR_SHOULD_EQUAL,
|
||||||
|
[exports.RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX]: exports.RESPONSE_SELECTOR_SHOULD_MATCH_REGEX,
|
||||||
|
};
|
||||||
function flipStatus(s) {
|
function flipStatus(s) {
|
||||||
if (s === exports.UP) {
|
if (s === exports.UP) {
|
||||||
return exports.DOWN;
|
return exports.DOWN;
|
||||||
|
|
22
src/util.ts
22
src/util.ts
|
@ -20,7 +20,11 @@ export const STATUS_PAGE_ALL_UP = 1;
|
||||||
export const STATUS_PAGE_PARTIAL_DOWN = 2;
|
export const STATUS_PAGE_PARTIAL_DOWN = 2;
|
||||||
|
|
||||||
// Monitor check types
|
// Monitor check types
|
||||||
|
export const MONITOR_CHECK_SHOULD = "SHOULD";
|
||||||
|
export const MONITOR_CHECK_SHOULD_NOT = "SHOULD_NOT";
|
||||||
|
|
||||||
export const HTTP_STATUS_CODE_SHOULD_EQUAL = "HTTP_STATUS_CODE_SHOULD_EQUAL";
|
export const HTTP_STATUS_CODE_SHOULD_EQUAL = "HTTP_STATUS_CODE_SHOULD_EQUAL";
|
||||||
|
export const HTTP_STATUS_CODE_SHOULD_NOT_EQUAL = "HTTP_STATUS_CODE_SHOULD_NOT_EQUAL";
|
||||||
export const RESPONSE_SHOULD_CONTAIN_TEXT = "RESPONSE_SHOULD_CONTAIN_TEXT";
|
export const RESPONSE_SHOULD_CONTAIN_TEXT = "RESPONSE_SHOULD_CONTAIN_TEXT";
|
||||||
export const RESPONSE_SHOULD_NOT_CONTAIN_TEXT = "RESPONSE_SHOULD_NOT_CONTAIN_TEXT";
|
export const RESPONSE_SHOULD_NOT_CONTAIN_TEXT = "RESPONSE_SHOULD_NOT_CONTAIN_TEXT";
|
||||||
export const RESPONSE_SHOULD_MATCH_REGEX = "RESPONSE_SHOULD_MATCH_REGEX";
|
export const RESPONSE_SHOULD_MATCH_REGEX = "RESPONSE_SHOULD_MATCH_REGEX";
|
||||||
|
@ -30,8 +34,26 @@ export const RESPONSE_SELECTOR_SHOULD_NOT_EQUAL = "RESPONSE_SELECTOR_SHOULD_NOT_
|
||||||
export const RESPONSE_SELECTOR_SHOULD_MATCH_REGEX = "RESPONSE_SELECTOR_SHOULD_MATCH_REGEX";
|
export const RESPONSE_SELECTOR_SHOULD_MATCH_REGEX = "RESPONSE_SELECTOR_SHOULD_MATCH_REGEX";
|
||||||
export const RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX = "RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX";
|
export const RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX = "RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX";
|
||||||
|
|
||||||
|
export const MONITOR_CHECK_HTTP_CODE_TYPES = [HTTP_STATUS_CODE_SHOULD_EQUAL, HTTP_STATUS_CODE_SHOULD_NOT_EQUAL];
|
||||||
export const MONITOR_CHECK_STRING_TYPES = [RESPONSE_SHOULD_CONTAIN_TEXT, RESPONSE_SHOULD_NOT_CONTAIN_TEXT, RESPONSE_SHOULD_MATCH_REGEX, RESPONSE_SHOULD_NOT_MATCH_REGEX];
|
export const MONITOR_CHECK_STRING_TYPES = [RESPONSE_SHOULD_CONTAIN_TEXT, RESPONSE_SHOULD_NOT_CONTAIN_TEXT, RESPONSE_SHOULD_MATCH_REGEX, RESPONSE_SHOULD_NOT_MATCH_REGEX];
|
||||||
export const MONITOR_CHECK_SELECTOR_TYPES = [RESPONSE_SELECTOR_SHOULD_EQUAL, RESPONSE_SELECTOR_SHOULD_NOT_EQUAL, RESPONSE_SELECTOR_SHOULD_MATCH_REGEX, RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX];
|
export const MONITOR_CHECK_SELECTOR_TYPES = [RESPONSE_SELECTOR_SHOULD_EQUAL, RESPONSE_SELECTOR_SHOULD_NOT_EQUAL, RESPONSE_SELECTOR_SHOULD_MATCH_REGEX, RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX];
|
||||||
|
export const MONITOR_CHECK_INVERTED_TYPES = [HTTP_STATUS_CODE_SHOULD_NOT_EQUAL, RESPONSE_SHOULD_NOT_CONTAIN_TEXT, RESPONSE_SHOULD_NOT_MATCH_REGEX, RESPONSE_SELECTOR_SHOULD_NOT_EQUAL, RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX];
|
||||||
|
|
||||||
|
export const MONITOR_CHECK_MAP_NORMAL_TO_INVERTED = {
|
||||||
|
[HTTP_STATUS_CODE_SHOULD_EQUAL]: HTTP_STATUS_CODE_SHOULD_NOT_EQUAL,
|
||||||
|
[RESPONSE_SHOULD_CONTAIN_TEXT]: RESPONSE_SHOULD_NOT_CONTAIN_TEXT,
|
||||||
|
[RESPONSE_SHOULD_MATCH_REGEX]: RESPONSE_SHOULD_NOT_MATCH_REGEX,
|
||||||
|
[RESPONSE_SELECTOR_SHOULD_EQUAL]: RESPONSE_SELECTOR_SHOULD_NOT_EQUAL,
|
||||||
|
[RESPONSE_SELECTOR_SHOULD_MATCH_REGEX]: RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const MONITOR_CHECK_MAP_INVERTED_TO_NORMAL = {
|
||||||
|
[HTTP_STATUS_CODE_SHOULD_NOT_EQUAL]: HTTP_STATUS_CODE_SHOULD_EQUAL,
|
||||||
|
[RESPONSE_SHOULD_NOT_CONTAIN_TEXT]: RESPONSE_SHOULD_CONTAIN_TEXT,
|
||||||
|
[RESPONSE_SHOULD_NOT_MATCH_REGEX]: RESPONSE_SHOULD_MATCH_REGEX,
|
||||||
|
[RESPONSE_SELECTOR_SHOULD_NOT_EQUAL]: RESPONSE_SELECTOR_SHOULD_EQUAL,
|
||||||
|
[RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX]: RESPONSE_SELECTOR_SHOULD_MATCH_REGEX,
|
||||||
|
};
|
||||||
|
|
||||||
export function flipStatus(s: number) {
|
export function flipStatus(s: number) {
|
||||||
if (s === UP) {
|
if (s === UP) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue