zspecza / common-tags

🔖 Useful template literal tags for dealing with strings in ES2015+
Other
1.99k stars 60 forks source link

New tag defaultEmpty #218

Open villelahdenvuo opened 1 year ago

villelahdenvuo commented 1 year ago

It's very common pattern to want to append a string only if it's not empty, so I made a helper to do that:

function isEmptyValue(value: unknown): boolean {
    return value === undefined ||
        value === null ||
        (typeof value === 'number' && Number.isNaN(value)) ||
        (typeof value === 'object' && Object.keys(value).length === 0) ||
        (typeof value === 'string' && value.trim().length === 0);
}

function defaultEmpty(strings: string[], ...expressions: unknown[]): string {
    if (expressions.some(isEmptyValue)) return '';
    return String.raw({ raw: strings }, ...expressions)
}

Example:

const filters = Math.random() > 0.5 ? '' : `bar = 'baz'`;
`SELECT * FROM foo WHERE bar = 'foo' ${defaultEmpty`OR ${filters}`}`
// -> "SELECT * FROM foo WHERE bar = 'foo' OR bar = 'baz'"
// -> "SELECT * FROM foo WHERE bar = 'foo' "

Better name ideas are welcome.