2021-10-10 23:18:33 +00:00
"use strict" ;
2023-10-13 14:42:45 +00:00
/ * !
2021-10-10 23:18:33 +00:00
// Common Util for frontend and backend
//
// DOT NOT MODIFY util.js!
2023-10-07 12:51:56 +00:00
// Need to run "npm run tsc" to compile if there are any changes.
2021-10-10 23:18:33 +00:00
//
// Backend uses the compiled file util.js
// Frontend uses util.ts
2023-10-13 14:42:45 +00:00
* /
2024-06-26 02:02:39 +00:00
var _ _importDefault = ( this && this . _ _importDefault ) || function ( mod ) {
return ( mod && mod . _ _esModule ) ? mod : { "default" : mod } ;
} ;
2023-12-09 09:48:25 +00:00
var _a ;
2021-10-18 09:51:40 +00:00
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
2023-12-10 18:36:08 +00:00
exports . sleep = exports . flipStatus = exports . badgeConstants = exports . CONSOLE _STYLE _BgGray = exports . CONSOLE _STYLE _BgWhite = exports . CONSOLE _STYLE _BgCyan = exports . CONSOLE _STYLE _BgMagenta = exports . CONSOLE _STYLE _BgBlue = exports . CONSOLE _STYLE _BgYellow = exports . CONSOLE _STYLE _BgGreen = exports . CONSOLE _STYLE _BgRed = exports . CONSOLE _STYLE _BgBlack = exports . CONSOLE _STYLE _FgPink = exports . CONSOLE _STYLE _FgBrown = exports . CONSOLE _STYLE _FgViolet = exports . CONSOLE _STYLE _FgLightBlue = exports . CONSOLE _STYLE _FgLightGreen = exports . CONSOLE _STYLE _FgOrange = exports . CONSOLE _STYLE _FgGray = exports . CONSOLE _STYLE _FgWhite = exports . CONSOLE _STYLE _FgCyan = exports . CONSOLE _STYLE _FgMagenta = exports . CONSOLE _STYLE _FgBlue = exports . CONSOLE _STYLE _FgYellow = exports . CONSOLE _STYLE _FgGreen = exports . CONSOLE _STYLE _FgRed = exports . CONSOLE _STYLE _FgBlack = exports . CONSOLE _STYLE _Hidden = exports . CONSOLE _STYLE _Reverse = exports . CONSOLE _STYLE _Blink = exports . CONSOLE _STYLE _Underscore = exports . CONSOLE _STYLE _Dim = exports . CONSOLE _STYLE _Bright = exports . CONSOLE _STYLE _Reset = exports . MIN _INTERVAL _SECOND = exports . MAX _INTERVAL _SECOND = exports . SQL _DATETIME _FORMAT _WITHOUT _SECOND = exports . SQL _DATETIME _FORMAT = exports . SQL _DATE _FORMAT = exports . STATUS _PAGE _MAINTENANCE = exports . STATUS _PAGE _PARTIAL _DOWN = exports . STATUS _PAGE _ALL _UP = exports . STATUS _PAGE _ALL _DOWN = exports . MAINTENANCE = exports . PENDING = exports . UP = exports . DOWN = exports . appName = exports . isNode = exports . isDev = void 0 ;
2024-10-08 23:43:44 +00:00
exports . evaluateJsonQuery = exports . intHash = exports . localToUTC = exports . utcToLocal = exports . utcToISODateTime = exports . isoToUTCDateTime = exports . parseTimeFromTimeObject = exports . parseTimeObject = exports . getMaintenanceRelativeURL = exports . getMonitorRelativeURL = exports . genSecret = exports . getCryptoRandomInt = exports . getRandomInt = exports . getRandomArbitrary = exports . TimeLogger = exports . polyfill = exports . log = exports . debug = exports . ucfirst = void 0 ;
exports . intHash = exports . localToUTC = exports . utcToLocal = exports . utcToISODateTime = exports . isoToUTCDateTime = exports . parseTimeFromTimeObject = exports . parseTimeObject = exports . getMaintenanceRelativeURL = exports . getMonitorRelativeURL = exports . genSecret = exports . getCryptoRandomInt = exports . getRandomInt = exports . getRandomArbitrary = exports . TimeLogger = exports . polyfill = exports . log = exports . debug = exports . ucfirst = void 0 ;
2024-07-15 20:07:13 +00:00
const dayjs _1 = _ _importDefault ( require ( "dayjs" ) ) ;
2024-10-08 23:43:44 +00:00
const dayjs = require ( "dayjs" ) ;
const jsonata = require ( "jsonata" ) ;
2021-10-10 23:18:33 +00:00
exports . isDev = process . env . NODE _ENV === "development" ;
2023-12-09 09:48:25 +00:00
exports . isNode = typeof process !== "undefined" && ( ( _a = process === null || process === void 0 ? void 0 : process . versions ) === null || _a === void 0 ? void 0 : _a . node ) ;
2021-10-10 23:18:33 +00:00
exports . appName = "Uptime Kuma" ;
exports . DOWN = 0 ;
exports . UP = 1 ;
exports . PENDING = 2 ;
2022-01-23 14:22:00 +00:00
exports . MAINTENANCE = 3 ;
2021-10-10 23:18:33 +00:00
exports . STATUS _PAGE _ALL _DOWN = 0 ;
exports . STATUS _PAGE _ALL _UP = 1 ;
exports . STATUS _PAGE _PARTIAL _DOWN = 2 ;
2022-01-23 14:22:00 +00:00
exports . STATUS _PAGE _MAINTENANCE = 3 ;
2022-10-09 18:28:03 +00:00
exports . SQL _DATE _FORMAT = "YYYY-MM-DD" ;
exports . SQL _DATETIME _FORMAT = "YYYY-MM-DD HH:mm:ss" ;
2022-10-11 10:23:17 +00:00
exports . SQL _DATETIME _FORMAT _WITHOUT _SECOND = "YYYY-MM-DD HH:mm" ;
2023-10-13 14:42:45 +00:00
exports . MAX _INTERVAL _SECOND = 2073600 ;
exports . MIN _INTERVAL _SECOND = 20 ;
2023-10-13 19:00:34 +00:00
exports . CONSOLE _STYLE _Reset = "\x1b[0m" ;
exports . CONSOLE _STYLE _Bright = "\x1b[1m" ;
exports . CONSOLE _STYLE _Dim = "\x1b[2m" ;
exports . CONSOLE _STYLE _Underscore = "\x1b[4m" ;
exports . CONSOLE _STYLE _Blink = "\x1b[5m" ;
exports . CONSOLE _STYLE _Reverse = "\x1b[7m" ;
exports . CONSOLE _STYLE _Hidden = "\x1b[8m" ;
exports . CONSOLE _STYLE _FgBlack = "\x1b[30m" ;
exports . CONSOLE _STYLE _FgRed = "\x1b[31m" ;
exports . CONSOLE _STYLE _FgGreen = "\x1b[32m" ;
exports . CONSOLE _STYLE _FgYellow = "\x1b[33m" ;
exports . CONSOLE _STYLE _FgBlue = "\x1b[34m" ;
exports . CONSOLE _STYLE _FgMagenta = "\x1b[35m" ;
exports . CONSOLE _STYLE _FgCyan = "\x1b[36m" ;
exports . CONSOLE _STYLE _FgWhite = "\x1b[37m" ;
exports . CONSOLE _STYLE _FgGray = "\x1b[90m" ;
exports . CONSOLE _STYLE _FgOrange = "\x1b[38;5;208m" ;
exports . CONSOLE _STYLE _FgLightGreen = "\x1b[38;5;119m" ;
exports . CONSOLE _STYLE _FgLightBlue = "\x1b[38;5;117m" ;
exports . CONSOLE _STYLE _FgViolet = "\x1b[38;5;141m" ;
exports . CONSOLE _STYLE _FgBrown = "\x1b[38;5;130m" ;
exports . CONSOLE _STYLE _FgPink = "\x1b[38;5;219m" ;
exports . CONSOLE _STYLE _BgBlack = "\x1b[40m" ;
exports . CONSOLE _STYLE _BgRed = "\x1b[41m" ;
exports . CONSOLE _STYLE _BgGreen = "\x1b[42m" ;
exports . CONSOLE _STYLE _BgYellow = "\x1b[43m" ;
exports . CONSOLE _STYLE _BgBlue = "\x1b[44m" ;
exports . CONSOLE _STYLE _BgMagenta = "\x1b[45m" ;
exports . CONSOLE _STYLE _BgCyan = "\x1b[46m" ;
exports . CONSOLE _STYLE _BgWhite = "\x1b[47m" ;
exports . CONSOLE _STYLE _BgGray = "\x1b[100m" ;
2024-10-06 01:36:54 +00:00
2023-10-13 19:00:34 +00:00
const consoleModuleColors = [
exports . CONSOLE _STYLE _FgCyan ,
exports . CONSOLE _STYLE _FgGreen ,
exports . CONSOLE _STYLE _FgLightGreen ,
exports . CONSOLE _STYLE _FgBlue ,
exports . CONSOLE _STYLE _FgLightBlue ,
exports . CONSOLE _STYLE _FgMagenta ,
exports . CONSOLE _STYLE _FgOrange ,
exports . CONSOLE _STYLE _FgViolet ,
exports . CONSOLE _STYLE _FgBrown ,
exports . CONSOLE _STYLE _FgPink ,
] ;
const consoleLevelColors = {
"INFO" : exports . CONSOLE _STYLE _FgCyan ,
"WARN" : exports . CONSOLE _STYLE _FgYellow ,
"ERROR" : exports . CONSOLE _STYLE _FgRed ,
"DEBUG" : exports . CONSOLE _STYLE _FgGray ,
} ;
2023-12-10 18:36:08 +00:00
exports . badgeConstants = {
naColor : "#999" ,
defaultUpColor : "#66c20a" ,
defaultWarnColor : "#eed202" ,
defaultDownColor : "#c2290a" ,
defaultPendingColor : "#f8a306" ,
defaultMaintenanceColor : "#1747f5" ,
defaultPingColor : "blue" ,
defaultStyle : "flat" ,
defaultPingValueSuffix : "ms" ,
defaultPingLabelSuffix : "h" ,
defaultUptimeValueSuffix : "%" ,
defaultUptimeLabelSuffix : "h" ,
defaultCertExpValueSuffix : " days" ,
defaultCertExpLabelSuffix : "h" ,
defaultCertExpireWarnDays : "14" ,
defaultCertExpireDownDays : "7"
} ;
2021-10-10 23:18:33 +00:00
function flipStatus ( s ) {
if ( s === exports . UP ) {
return exports . DOWN ;
}
if ( s === exports . DOWN ) {
return exports . UP ;
}
return s ;
}
exports . flipStatus = flipStatus ;
function sleep ( ms ) {
2021-10-14 14:32:15 +00:00
return new Promise ( resolve => setTimeout ( resolve , ms ) ) ;
2021-10-10 23:18:33 +00:00
}
exports . sleep = sleep ;
function ucfirst ( str ) {
if ( ! str ) {
return str ;
}
2021-10-14 14:32:15 +00:00
const firstLetter = str . substr ( 0 , 1 ) ;
2021-10-10 23:18:33 +00:00
return firstLetter . toUpperCase ( ) + str . substr ( 1 ) ;
}
exports . ucfirst = ucfirst ;
2024-10-08 23:43:44 +00:00
function debug ( msg ) {
exports . log . log ( "" , msg , "debug" ) ;
}
exports . debug = debug ;
2022-04-13 15:33:37 +00:00
class Logger {
2022-04-16 06:50:48 +00:00
constructor ( ) {
this . hideLog = {
info : [ ] ,
warn : [ ] ,
error : [ ] ,
debug : [ ] ,
} ;
if ( typeof process !== "undefined" && process . env . UPTIME _KUMA _HIDE _LOG ) {
2023-10-13 14:42:45 +00:00
const list = process . env . UPTIME _KUMA _HIDE _LOG . split ( "," ) . map ( v => v . toLowerCase ( ) ) ;
for ( const pair of list ) {
const values = pair . split ( / _ ( . * ) / s ) ;
2022-04-16 06:50:48 +00:00
if ( values . length >= 2 ) {
this . hideLog [ values [ 0 ] ] . push ( values [ 1 ] ) ;
}
}
this . debug ( "server" , "UPTIME_KUMA_HIDE_LOG is set" ) ;
this . debug ( "server" , this . hideLog ) ;
}
}
2022-04-13 15:33:37 +00:00
log ( module , msg , level ) {
2023-11-24 08:03:35 +00:00
if ( level === "DEBUG" && ! exports . isDev ) {
return ;
}
2022-12-12 09:19:22 +00:00
if ( this . hideLog [ level ] && this . hideLog [ level ] . includes ( module . toLowerCase ( ) ) ) {
2022-04-16 06:50:48 +00:00
return ;
}
2024-10-08 23:43:44 +00:00
module = module . toUpperCase ( ) ;
level = level . toUpperCase ( ) ;
2022-12-26 06:46:12 +00:00
let now ;
2024-06-26 02:02:39 +00:00
if ( dayjs _1 . default . tz ) {
now = dayjs _1 . default . tz ( new Date ( ) ) . format ( ) ;
2022-12-26 06:46:12 +00:00
}
else {
2024-06-26 02:02:39 +00:00
now = ( 0 , dayjs _1 . default ) ( ) . format ( ) ;
2022-12-26 06:46:12 +00:00
}
2023-10-13 19:00:34 +00:00
const levelColor = consoleLevelColors [ level ] ;
const moduleColor = consoleModuleColors [ intHash ( module , consoleModuleColors . length ) ] ;
2024-10-08 23:43:44 +00:00
let timePart ;
let modulePart ;
let levelPart ;
let msgPart ;
2023-12-09 09:48:25 +00:00
if ( exports . isNode ) {
switch ( level ) {
case "DEBUG" :
timePart = exports . CONSOLE _STYLE _FgGray + now + exports . CONSOLE _STYLE _Reset ;
break ;
default :
timePart = exports . CONSOLE _STYLE _FgCyan + now + exports . CONSOLE _STYLE _Reset ;
break ;
2023-10-14 09:48:41 +00:00
}
2023-12-09 09:48:25 +00:00
modulePart = "[" + moduleColor + module + exports . CONSOLE _STYLE _Reset + "]" ;
levelPart = levelColor + ` ${ level } : ` + exports . CONSOLE _STYLE _Reset ;
switch ( level ) {
case "ERROR" :
if ( typeof msg === "string" ) {
msgPart = exports . CONSOLE _STYLE _FgRed + msg + exports . CONSOLE _STYLE _Reset ;
}
2024-10-08 23:43:44 +00:00
else {
msgPart = msg ;
}
2023-12-09 09:48:25 +00:00
break ;
case "DEBUG" :
if ( typeof msg === "string" ) {
msgPart = exports . CONSOLE _STYLE _FgGray + msg + exports . CONSOLE _STYLE _Reset ;
}
2024-10-08 23:43:44 +00:00
else {
msgPart = msg ;
}
break ;
default :
msgPart = msg ;
2023-12-09 09:48:25 +00:00
break ;
2022-04-13 15:33:37 +00:00
}
}
else {
2024-10-08 23:43:44 +00:00
timePart = now ;
2023-12-09 09:48:25 +00:00
modulePart = ` [ ${ module } ] ` ;
levelPart = ` ${ level } : ` ;
2024-10-08 23:43:44 +00:00
msgPart = msg ;
2023-12-09 09:48:25 +00:00
}
switch ( level ) {
case "ERROR" :
console . error ( timePart , modulePart , levelPart , msgPart ) ;
break ;
case "WARN" :
console . warn ( timePart , modulePart , levelPart , msgPart ) ;
break ;
case "INFO" :
console . info ( timePart , modulePart , levelPart , msgPart ) ;
break ;
case "DEBUG" :
if ( exports . isDev ) {
console . debug ( timePart , modulePart , levelPart , msgPart ) ;
}
break ;
default :
console . log ( timePart , modulePart , levelPart , msgPart ) ;
break ;
2022-04-13 15:33:37 +00:00
}
2021-11-11 11:31:28 +00:00
}
2022-04-13 15:33:37 +00:00
info ( module , msg ) {
2024-10-08 23:43:44 +00:00
this . log ( module , msg , "info" ) ;
2021-11-11 11:31:28 +00:00
}
2022-04-13 15:33:37 +00:00
warn ( module , msg ) {
2024-10-08 23:43:44 +00:00
this . log ( module , msg , "warn" ) ;
2021-11-11 11:31:28 +00:00
}
2022-04-13 15:33:37 +00:00
error ( module , msg ) {
2024-10-08 23:43:44 +00:00
this . log ( module , msg , "error" ) ;
2021-11-11 11:31:28 +00:00
}
2022-04-13 15:33:37 +00:00
debug ( module , msg ) {
2024-10-08 23:43:44 +00:00
this . log ( module , msg , "debug" ) ;
2022-04-13 15:33:37 +00:00
}
exception ( module , exception , msg ) {
let finalMessage = exception ;
if ( msg ) {
finalMessage = ` ${ msg } : ${ exception } ` ;
}
2024-10-08 23:43:44 +00:00
this . log ( module , finalMessage , "error" ) ;
2021-10-10 23:18:33 +00:00
}
}
2022-04-13 15:33:37 +00:00
exports . log = new Logger ( ) ;
2021-10-10 23:18:33 +00:00
function polyfill ( ) {
if ( ! String . prototype . replaceAll ) {
String . prototype . replaceAll = function ( str , newStr ) {
if ( Object . prototype . toString . call ( str ) . toLowerCase ( ) === "[object regexp]" ) {
return this . replace ( str , newStr ) ;
}
return this . replace ( new RegExp ( str , "g" ) , newStr ) ;
} ;
}
}
exports . polyfill = polyfill ;
2021-10-14 14:32:15 +00:00
class TimeLogger {
constructor ( ) {
2024-06-26 02:02:39 +00:00
this . startTime = ( 0 , dayjs _1 . default ) ( ) . valueOf ( ) ;
2021-10-10 23:18:33 +00:00
}
2021-10-14 14:32:15 +00:00
print ( name ) {
2021-10-10 23:18:33 +00:00
if ( exports . isDev && process . env . TIMELOGGER === "1" ) {
2024-06-26 02:02:39 +00:00
console . log ( name + ": " + ( ( 0 , dayjs _1 . default ) ( ) . valueOf ( ) - this . startTime ) + "ms" ) ;
2021-10-10 23:18:33 +00:00
}
2021-10-14 14:32:15 +00:00
}
}
2021-10-10 23:18:33 +00:00
exports . TimeLogger = TimeLogger ;
function getRandomArbitrary ( min , max ) {
return Math . random ( ) * ( max - min ) + min ;
}
exports . getRandomArbitrary = getRandomArbitrary ;
function getRandomInt ( min , max ) {
min = Math . ceil ( min ) ;
max = Math . floor ( max ) ;
return Math . floor ( Math . random ( ) * ( max - min + 1 ) ) + min ;
}
exports . getRandomInt = getRandomInt ;
2023-10-13 14:42:45 +00:00
const getRandomBytes = ( ( typeof window !== "undefined" && window . crypto )
2021-10-17 23:06:20 +00:00
? function ( ) {
2021-10-18 09:51:40 +00:00
return ( numBytes ) => {
2023-10-13 14:42:45 +00:00
const randomBytes = new Uint8Array ( numBytes ) ;
2021-10-18 09:51:40 +00:00
for ( let i = 0 ; i < numBytes ; i += 65536 ) {
2021-10-17 23:06:20 +00:00
window . crypto . getRandomValues ( randomBytes . subarray ( i , i + Math . min ( numBytes - i , 65536 ) ) ) ;
}
return randomBytes ;
} ;
}
: function ( ) {
return require ( "crypto" ) . randomBytes ;
} ) ( ) ;
2021-10-10 23:18:33 +00:00
function getCryptoRandomInt ( min , max ) {
2021-10-18 09:51:40 +00:00
const range = max - min ;
2023-10-13 14:42:45 +00:00
if ( range >= Math . pow ( 2 , 32 ) ) {
2021-10-17 23:06:20 +00:00
console . log ( "Warning! Range is too large." ) ;
2023-10-13 14:42:45 +00:00
}
2021-10-18 09:51:40 +00:00
let tmpRange = range ;
let bitsNeeded = 0 ;
let bytesNeeded = 0 ;
let mask = 1 ;
2021-10-17 23:06:20 +00:00
while ( tmpRange > 0 ) {
2023-10-13 14:42:45 +00:00
if ( bitsNeeded % 8 === 0 ) {
2021-10-17 23:06:20 +00:00
bytesNeeded += 1 ;
2023-10-13 14:42:45 +00:00
}
2021-10-17 23:06:20 +00:00
bitsNeeded += 1 ;
mask = mask << 1 | 1 ;
tmpRange = tmpRange >>> 1 ;
}
2021-10-18 09:51:40 +00:00
const randomBytes = getRandomBytes ( bytesNeeded ) ;
let randomValue = 0 ;
for ( let i = 0 ; i < bytesNeeded ; i ++ ) {
2021-10-17 23:06:20 +00:00
randomValue |= randomBytes [ i ] << 8 * i ;
}
randomValue = randomValue & mask ;
if ( randomValue <= range ) {
return min + randomValue ;
}
else {
return getCryptoRandomInt ( min , max ) ;
}
2021-10-10 23:18:33 +00:00
}
exports . getCryptoRandomInt = getCryptoRandomInt ;
2021-10-18 09:51:40 +00:00
function genSecret ( length = 64 ) {
let secret = "" ;
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ;
const charsLength = chars . length ;
for ( let i = 0 ; i < length ; i ++ ) {
2021-10-10 23:18:33 +00:00
secret += chars . charAt ( getCryptoRandomInt ( 0 , charsLength - 1 ) ) ;
}
return secret ;
}
exports . genSecret = genSecret ;
function getMonitorRelativeURL ( id ) {
return "/dashboard/" + id ;
}
exports . getMonitorRelativeURL = getMonitorRelativeURL ;
2022-01-23 14:22:00 +00:00
function getMaintenanceRelativeURL ( id ) {
2022-09-17 14:00:11 +00:00
return "/maintenance/" + id ;
2022-01-23 14:22:00 +00:00
}
exports . getMaintenanceRelativeURL = getMaintenanceRelativeURL ;
2022-09-25 11:38:28 +00:00
function parseTimeObject ( time ) {
2022-09-24 11:18:24 +00:00
if ( ! time ) {
return {
hours : 0 ,
minutes : 0 ,
} ;
}
2023-10-13 14:42:45 +00:00
const array = time . split ( ":" ) ;
2022-09-24 11:18:24 +00:00
if ( array . length < 2 ) {
throw new Error ( "parseVueDatePickerTimeFormat: Invalid Time" ) ;
}
2023-10-13 14:42:45 +00:00
const obj = {
2022-09-24 11:18:24 +00:00
hours : parseInt ( array [ 0 ] ) ,
minutes : parseInt ( array [ 1 ] ) ,
seconds : 0 ,
} ;
if ( array . length >= 3 ) {
obj . seconds = parseInt ( array [ 2 ] ) ;
}
return obj ;
}
2022-09-25 11:38:28 +00:00
exports . parseTimeObject = parseTimeObject ;
function parseTimeFromTimeObject ( obj ) {
2022-09-24 11:18:24 +00:00
if ( ! obj ) {
return obj ;
}
let result = "" ;
result += obj . hours . toString ( ) . padStart ( 2 , "0" ) + ":" + obj . minutes . toString ( ) . padStart ( 2 , "0" ) ;
if ( obj . seconds ) {
result += ":" + obj . seconds . toString ( ) . padStart ( 2 , "0" ) ;
}
return result ;
}
2022-09-25 11:38:28 +00:00
exports . parseTimeFromTimeObject = parseTimeFromTimeObject ;
2022-09-27 16:48:15 +00:00
function isoToUTCDateTime ( input ) {
2024-06-26 02:02:39 +00:00
return ( 0 , dayjs _1 . default ) ( input ) . utc ( ) . format ( exports . SQL _DATETIME _FORMAT ) ;
2022-09-27 16:48:15 +00:00
}
exports . isoToUTCDateTime = isoToUTCDateTime ;
function utcToISODateTime ( input ) {
2024-06-26 02:02:39 +00:00
return dayjs _1 . default . utc ( input ) . toISOString ( ) ;
2022-09-27 16:48:15 +00:00
}
exports . utcToISODateTime = utcToISODateTime ;
2022-10-11 10:23:17 +00:00
function utcToLocal ( input , format = exports . SQL _DATETIME _FORMAT ) {
2024-06-26 02:02:39 +00:00
return dayjs _1 . default . utc ( input ) . local ( ) . format ( format ) ;
2022-10-09 18:28:03 +00:00
}
exports . utcToLocal = utcToLocal ;
2022-10-11 10:23:17 +00:00
function localToUTC ( input , format = exports . SQL _DATETIME _FORMAT ) {
2024-06-26 02:02:39 +00:00
return ( 0 , dayjs _1 . default ) ( input ) . utc ( ) . format ( format ) ;
2022-10-09 18:28:03 +00:00
}
exports . localToUTC = localToUTC ;
2023-10-13 19:00:34 +00:00
function intHash ( str , length = 10 ) {
let hash = 0 ;
for ( let i = 0 ; i < str . length ; i ++ ) {
hash += str . charCodeAt ( i ) ;
}
return ( hash % length + length ) % length ;
}
exports . intHash = intHash ;
2024-06-05 22:09:53 +00:00
async function evaluateJsonQuery ( data , jsonPath , jsonPathOperator , expectedValue ) {
2024-06-06 16:04:20 +00:00
let response ;
2024-06-05 22:09:53 +00:00
try {
2024-06-06 16:04:20 +00:00
response = JSON . parse ( data ) ;
2024-06-05 22:09:53 +00:00
}
2024-06-06 16:04:20 +00:00
catch ( _a ) {
2024-06-14 22:45:51 +00:00
response = ( typeof data === "object" || typeof data === "number" ) && ! Buffer . isBuffer ( data ) ? data : data . toString ( ) ;
2024-06-05 22:09:53 +00:00
}
2024-06-07 22:35:06 +00:00
try {
response = ( jsonPath ) ? await jsonata ( jsonPath ) . evaluate ( response ) : response ;
2024-06-14 22:45:51 +00:00
if ( response === null || response === undefined ) {
throw new Error ( "Empty or undefined response. Check query syntax and response structure" ) ;
}
if ( typeof response === "object" || response instanceof Date || typeof response === "function" ) {
2024-06-10 18:49:41 +00:00
throw new Error ( ` The post-JSON query evaluated response from the server is of type ${ typeof response } , which cannot be directly compared to the expected value ` ) ;
}
2024-06-07 22:35:06 +00:00
let jsonQueryExpression ;
switch ( jsonPathOperator ) {
case ">" :
case ">=" :
case "<" :
case "<=" :
2024-06-10 18:25:55 +00:00
jsonQueryExpression = ` $ number( $ .value) ${ jsonPathOperator } $ number( $ .expected) ` ;
2024-06-07 22:35:06 +00:00
break ;
case "!=" :
2024-06-10 18:25:55 +00:00
jsonQueryExpression = "$.value != $.expected" ;
2024-06-07 22:35:06 +00:00
break ;
case "==" :
2024-06-10 18:25:55 +00:00
jsonQueryExpression = "$.value = $.expected" ;
2024-06-07 22:35:06 +00:00
break ;
case "contains" :
2024-06-10 18:25:55 +00:00
jsonQueryExpression = "$contains($.value, $.expected)" ;
2024-06-07 22:35:06 +00:00
break ;
default :
throw new Error ( ` Invalid condition ${ jsonPathOperator } ` ) ;
2024-06-07 00:52:33 +00:00
}
2024-06-07 22:35:06 +00:00
const expression = jsonata ( jsonQueryExpression ) ;
const status = await expression . evaluate ( {
2024-06-10 18:25:55 +00:00
value : response . toString ( ) ,
expected : expectedValue . toString ( )
2024-06-07 22:35:06 +00:00
} ) ;
2024-06-14 22:45:51 +00:00
if ( status === undefined ) {
2024-06-07 22:35:06 +00:00
throw new Error ( "Query evaluation returned undefined. Check query syntax and the structure of the response data" ) ;
2024-06-07 00:52:33 +00:00
}
2024-06-07 22:35:06 +00:00
return {
status ,
response
} ;
2024-06-07 00:52:33 +00:00
}
2024-06-07 22:35:06 +00:00
catch ( err ) {
2024-06-14 22:45:51 +00:00
response = JSON . stringify ( response ) ;
response = ( response && response . length > 50 ) ? ` ${ response . substring ( 0 , 100 ) } … (truncated) ` : response ;
2024-06-07 22:35:06 +00:00
throw new Error ( ` Error evaluating JSON query: ${ err . message } . Response from server was: ${ response } ` ) ;
2024-06-05 22:09:53 +00:00
}
}
exports . evaluateJsonQuery = evaluateJsonQuery ;