@technobuddha/library
Version: 
A large library of useful functions
51 lines • 4.34 kB
JavaScript
import { build } from "./build.js";
import { collapse } from "./collapse.js";
import { splitChars } from "./split-chars.js";
import { zipperMerge } from "./zipper-merge.js";
/**
 * Constructs a new `RegExp` object by interpolating regular expressions into a template string.
 *
 * This function merges the provided template string and an array of `RegExp` arguments,
 * combining their sources and flags. It ensures that each interpolated regular expression
 * is safely wrapped in a non-capturing group unless it is already a character class, a
 * non-capturing group, or a fully anchored pattern. All flags from the arguments are
 * collected and applied to the resulting regular expression.
 *
 * @param flags - A set of regular expression flags to be applied to the resulting RegExp.
 * @param template - The template string array representing the static parts of the pattern.
 * @param args - An array of `RegExp` objects to interpolate into the template.
 * @returns A new `RegExp` object constructed from the template and interpolated patterns.
 * @internal
 */
function reTemplate(flags, template, args) {
    const reText = build(collapse(zipperMerge(Array.from(template.raw), args.map((a) => {
        for (const flag of splitChars(a.flags)) {
            flags.add(flag);
        }
        let { source } = a;
        if (source.startsWith('^') && source.endsWith('$')) {
            source = source.slice(1, -1);
        }
        if (source.startsWith('[') && source.endsWith(']')) {
            return source;
        }
        if (source.startsWith('(?:') && source.endsWith(')')) {
            return source;
        }
        return `(?:${source})`;
    })).flat()));
    return new RegExp(reText, build(flags.values()));
}
/**
 * Creates a tagged template function for building regular expressions with optional specified flags.
 * @group RegExp
 * @category Construction
 */
export function re(first, ...rest) {
    if (typeof first === 'string') {
        const flags = new Set([...splitChars(first), 'u']);
        return (template, ...args) => reTemplate(flags, template, args);
    }
    return reTemplate(new Set(['u']), first, rest);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxLQUFrQixFQUFFLFFBQThCLEVBQUUsSUFBYztJQUNwRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQ2xCLFFBQVEsQ0FDTixXQUFXLENBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUNiLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxNQUFNLE1BQU0sR0FBRyxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUNILENBQUMsSUFBSSxFQUFFLENBQ1QsQ0FDRixDQUFDO0lBRUYsT0FBTyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQXlDRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEVBQUUsQ0FDaEIsS0FBb0MsRUFDcEMsR0FBRyxJQUFjO0lBRWpCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sQ0FBQyxRQUE4QixFQUFFLEdBQUcsSUFBYyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDIn0=