39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import { isBoolean, isNull, isNumber, isString, isUndefined, kebabCase } from '@pengzhanbo/utils'
|
|
|
|
export function stringifyAttrs<T extends object = object>(
|
|
attrs: T,
|
|
withUndefined = false,
|
|
): string {
|
|
const result = Object.entries(attrs)
|
|
.map(([key, value]) => {
|
|
const k = kebabCase(key)
|
|
if (isUndefined(value) || value === 'undefined')
|
|
return withUndefined ? `:${k}="undefined"` : ''
|
|
|
|
if (isNull(value) || value === 'null')
|
|
return withUndefined ? `:${k}="null"` : ''
|
|
|
|
if (value === 'true')
|
|
value = true
|
|
if (value === 'false')
|
|
value = false
|
|
|
|
if (isBoolean(value))
|
|
return value ? `${k}` : ''
|
|
|
|
if (isNumber(value))
|
|
return `:${k}="${value}"`
|
|
|
|
// like object or array
|
|
if (isString(value) && (value[0] === '{' || value[0] === '['))
|
|
return `:${k}="${value.replaceAll('\"', '\'')}"`
|
|
|
|
const hasDynamic = key[0] === ':'
|
|
return `${hasDynamic ? ':' : ''}${k}="${String(value)}"`
|
|
})
|
|
.filter(Boolean)
|
|
.join(' ')
|
|
|
|
return result ? ` ${result}` : ''
|
|
}
|