api / const

stringTrap

Creates the string trap for signalified strings.

Source: src/api/traps/string-trap.ts

Creates the string trap for signalified strings.

Signature

export const stringTrap = (
  input: MaybeSignalValue<string>
): StringSignalTrap => {
  const SIMPLE_STRING_METHODS = [
    "at",
    "charAt",
    "charCodeAt",
    "codePointAt",
    "concat",
    "endsWith",
    "includes",
    "indexOf",
    "lastIndexOf",
    "padEnd",
    "padStart",
    "repeat",
    "slice",
    "startsWith",
    "substring",
    "trim",
    "trimEnd",
    "trimStart",
  ] as const;
  type StringMethodName = (typeof SIMPLE_STRING_METHODS)[number];
  type SimpleStringMethods = Pick<StringSignalTrap, StringMethodName>;

  const simpleMethodsTrapObject = SIMPLE_STRING_METHODS.reduce(
    (map: SimpleStringMethods, stringMethod) => {
      const method: SignalifiedFunction<string[typeof stringMethod]> = (
        ...params
      ) => {
        return derive(() => {
          const prms = getDesignalifiedMethodParams(...params);
          // @ts-ignore: A spread argument must either have a tuple type or be passed to a rest parameter.
          return (value(input) as string)[stringMethod](...prms);
        });
      };
      map[stringMethod] = method;
      return map;
    },
    {} as SimpleStringMethods
  );

  return {
    ...genericTrap(input),
    ...simpleMethodsTrapObject,
    get length() {
      return derive(() => value(input).length);
    },
    get lowercase() {
      return derive(() => (value(input) as string).toLowerCase());
    },
    get Sentencecase() {
      return derive(() => {
        const str = value(input) as string;
        return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
      });
    },
    get TitleCase() {
      return derive(() =>
        (value(input) as string)
          .toLowerCase()
          .replace(/\b\w/g, (c) => c.toUpperCase())
      );
    },
    get UPPERCASE() {
      return derive(() => (value(input) as string).toUpperCase());
    },
    localeCompare: (
      that: MaybeSignalValue<string>,
      locales?: MaybeSignalValue<string | string[] | undefined>,
      options?: Intl.CollatorOptions
    ) =>
      derive(() =>
        value(input).localeCompare(value(that), value(locales), options)
      ),
    normalize: (form: MaybeSignalValue<"NFC" | "NFD" | "NFKC" | "NFKD">) =>
      derive(() => value(input).normalize(value(form))),
    replace: (
      searchValue: MaybeSignalValue<string> | RegExp,
      replaceValue: MaybeSignalValue<string>
    ) =>
      derive(() =>
        value(input).replace(value(searchValue), value(replaceValue))
      ),
    replaceAll: (
      searchValue: MaybeSignalValue<string> | RegExp,
      replaceValue: MaybeSignalValue<string>
    ) =>
      derive(() =>
        value(input).replaceAll(value(searchValue), value(replaceValue))
      ),
    search: (regexp: RegExp) => derive(() => value(input).search(regexp)),
    split: (
      separator: MaybeSignalValue<string> | RegExp,
      limit?: MaybeSignalValue<number | undefined>
    ) =>
      derive(() => {
        const separatorVal =
          separator instanceof RegExp ? separator : value(separator);
        return value(input).split(separatorVal, value(limit));
      }),
    toLocaleLowerCase: (
      locales?: MaybeSignalValue<string | string[] | undefined>
    ) => derive(() => value(input).toLocaleLowerCase(value(locales))),
    toLocaleUpperCase: (
      locales?: MaybeSignalValue<string | string[] | undefined>
    ) => derive(() => value(input).toLocaleUpperCase(value(locales))),
  };
};

Parameters

  • input: A signalified string

Returns

A string trap with string methods and derived accessors

Remarks

  • Uses derived signals for every accessor and method
  • The trap type is selected once at creation time