/*
Copyright (C) 2017 Cloudbase Solutions SRL
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
import configLoader from './Config'
export type FileContent = {
name: string,
content: string,
}
class ObjectUtils {
static notEmpty(value: T | null | undefined): value is T {
return value != null
}
static flatten(object: any, appendParentPath?: boolean, parent?: string): any {
let result: any = {}
Object.keys(object).forEach(k => {
if (typeof object[k] === 'object' && !Array.isArray(object[k])) {
if (object[k]) {
result = {
...result,
...this.flatten(object[k], appendParentPath, k),
}
}
} else {
let key = k
if (appendParentPath && parent) {
key = `${parent}/${k}`
}
result[key] = object[k]
}
})
if (Object.keys(result).length === 0) {
return null
}
return result
}
static skipFields(object: any, fieldNames: string[]) {
const result: any = {}
if (Object.keys(object).length === 0) {
return null
}
Object.keys(object).forEach(k => {
if (!fieldNames.find(fn => fn === k)) {
result[k] = object[k]
}
})
if (Object.keys(result).length === 0) {
return null
}
return result
}
static async wait(ms: number) {
return new Promise(r => setTimeout(() => r(), ms))
}
static async waitFor(
predicate: () => boolean, timeoutMs: number = 15000, tryEvery: number = 1000,
) {
const startTime = new Date().getTime()
const testLoop = async () => {
if (predicate()) {
return
}
if (new Date().getTime() - startTime > timeoutMs) {
throw new Error(`Timeout: waiting for more than ${timeoutMs} ms`)
}
await this.wait(tryEvery)
await testLoop()
}
await testLoop()
}
static trim(fieldName: string, value: any): any {
const isPassword = configLoader.config.passwordFields.find(p => p === fieldName)
|| fieldName.toLowerCase().indexOf('password') > -1
return typeof value === 'string' && !isPassword ? value.trim() : value
}
static capitalizeFirstLetter(value: string): string {
return value.charAt(0).toUpperCase() + value.slice(1)
}
}
export default ObjectUtils