UNPKG

@technobuddha/library

Version:
51 lines 4.34 kB
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=