All files / src template-message.ts

100% Statements 22/22
100% Branches 7/7
100% Functions 1/1
100% Lines 22/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36                      2x 14x 14x 14x 14x 14x 14x 17x 17x 17x 17x 14x   14x 4x 4x   10x 12x 20x 20x 12x 12x 10x  
import { type TFunctionArgs } from "./interface";
 
export type TemplateMessageFn = (args: TFunctionArgs) => string;
 
export type LocaleTemplateMessageFns = Map<string, TemplateMessageFn | false>;
 
/**
 * Create an interpreter function for template locale message.
 *
 * `"a {{b}} c"` => `` `a ${args.b} c` ``
 */
export const createTemplateMessageFn = (message: string): TemplateMessageFn | false => {
  const slices: string[] = [];
  const keys: string[] = [];
  const matchArgs = /{{(\S+?)}}/gi;
  let slice: RegExpExecArray | null;
  let pointer = 0;
  while ((slice = matchArgs.exec(message))) {
    slices.push(message.slice(pointer, slice.index), "");
    keys.push(slice[1]);
    pointer = slice.index + slice[0].length;
  }
  slices.push(message.slice(pointer));
 
  if (keys.length <= 0) {
    return false;
  }
 
  return (args: TFunctionArgs): string => {
    for (let i = keys.length - 1; i >= 0; i--) {
      slices[i * 2 + 1] = args[keys[i]] ?? keys[i];
    }
    return slices.join("");
  };
};