You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.2 KiB
80 lines
2.2 KiB
import { Service } from '../../../../di/src/decorator/Service.ts'
|
|
import { Logging } from '../logging/Logging.ts'
|
|
import {uuid} from '../../external/std.ts'
|
|
|
|
/**
|
|
* Base service with some utility helpers.
|
|
*/
|
|
@Service()
|
|
export default class Utility {
|
|
constructor(
|
|
protected logger: Logging
|
|
) {}
|
|
|
|
/**
|
|
* Make a deep copy of an object.
|
|
* @param target
|
|
*/
|
|
deep_copy<T>(target: T): T {
|
|
if ( target === null )
|
|
return target
|
|
|
|
if ( target instanceof Date )
|
|
return new Date(target.getTime()) as any
|
|
|
|
if ( target instanceof Array ) {
|
|
const copy = [] as any[]
|
|
(target as any[]).forEach(item => { copy.push(item) })
|
|
return copy.map((item: any) => this.deep_copy<any>(item)) as any
|
|
}
|
|
|
|
if ( typeof target === 'object' && target !== {} ) {
|
|
const copy = { ...(target as {[key: string]: any }) } as { [key: string]: any }
|
|
Object.keys(copy).forEach(key => {
|
|
copy[key] = this.deep_copy<any>(copy[key])
|
|
})
|
|
}
|
|
|
|
return target
|
|
}
|
|
|
|
// TODO deep_merge
|
|
|
|
/**
|
|
* Given a string of a value, try to infer the JavaScript type.
|
|
* @param {string} val
|
|
*/
|
|
infer(val: string): any {
|
|
if ( !val ) return undefined
|
|
else if ( val.toLowerCase() === 'true' ) return true
|
|
else if ( val.toLowerCase() === 'false' ) return false
|
|
else if ( !isNaN(Number(val)) ) return Number(val)
|
|
else if ( this.is_json(val) ) return JSON.parse(val)
|
|
else if ( val.toLowerCase() === 'null' ) return null
|
|
else if ( val.toLowerCase() === 'undefined' ) return undefined
|
|
else return val
|
|
}
|
|
|
|
/**
|
|
* Returns true if the given value is valid JSON.
|
|
* @param {string} val
|
|
*/
|
|
is_json(val: string): boolean {
|
|
try {
|
|
JSON.parse(val)
|
|
return true
|
|
} catch(e) {
|
|
this.logger.verbose(`Error encountered while checking is_json. Might be invalid. Error: ${e.message}`)
|
|
return false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get a universally-unique ID string.
|
|
* @return string
|
|
*/
|
|
uuid(): string {
|
|
return uuid()
|
|
}
|
|
}
|