onEndResult: endResult => `${endResult}!`
});

new commonTags.TemplateTag({
    onSubstitution: substitution => `${substitution}!`,
    onEndResult: endResult => `${endResult}!`
});

/* Tests Built-in Transformers */

new commonTags.TemplateTag(commonTags.trimResultTransformer());
new commonTags.TemplateTag(commonTags.trimResultTransformer('left'));
new commonTags.TemplateTag(commonTags.trimResultTransformer('right'));

new commonTags.TemplateTag(commonTags.stripIndentTransformer());
new commonTags.TemplateTag(commonTags.stripIndentTransformer('initial'));
new commonTags.TemplateTag(commonTags.stripIndentTransformer('all'));

new commonTags.TemplateTag(commonTags.replaceResultTransformer('foo', 'bar'));
new commonTags.TemplateTag(commonTags.replaceSubstitutionTransformer(/baz/g, 'bar'));

new commonTags.TemplateTag(commonTags.replaceSubstitutionTransformer('foo', 'bar'));
new commonTags.TemplateTag(commonTags.replaceSubstitutionTransformer(/baz/g, 'bar'));

new commonTags.TemplateTag(commonTags.inlineArrayTransformer());
new commonTags.TemplateTag(commonTags.inlineArrayTransformer({}));
new commonTags.TemplateTag(commonTags.inlineArrayTransformer({separator: 'foo'}));
new commonTags.TemplateTag(commonTags.inlineArrayTransformer({conjunction: 'bar'}));

new commonTags.TemplateTag(commonTags.splitStringTransformer('foo'));
createTag(stripIndentTransformer('initial'));
createTag(stripIndentTransformer('all'));

createTag(replaceResultTransformer('foo', 'bar'));
createTag(replaceResultTransformer(/baz/g, 'bar'));
createTag(
    replaceResultTransformer(/baz/g, (substring, ...matches) => {
        // $ExpectType string
        substring;
        // $ExpectType any[]
        matches;
        return '';
    })
);

createTag(replaceSubstitutionTransformer('foo', 'bar'));
createTag(replaceSubstitutionTransformer(/baz/g, 'bar'));
createTag(
    replaceSubstitutionTransformer(/baz/g, (substring, ...matches) => {
        // $ExpectType string
        substring;
        // $ExpectType any[]
        matches;
        return '';
    })
);

createTag(replaceStringTransformer('foo', 'bar'));
createTag(replaceStringTransformer(/baz/g, 'bar'));
createTag(
    replaceStringTransformer(/baz/g, (substring, ...matches) => {