Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / sieve / src / helpers.ts
blob9b0591ce00505cf5e8c2112126e07810e181b7e3
1 import type { EscapeVariableType, LABEL_KEY_TYPE } from './interface';
2 import { LABEL_KEYS } from './interface';
4 type ReturnValue = { Value: String; Type: String };
6 /**
7  * Builds a value label object.
8  */
9 export const buildLabelValueObject = (value: LABEL_KEY_TYPE) => ({
10     value,
11     label: LABEL_KEYS[value],
12 });
14 /**
15  * Escapes the sieve specific characters. (aka *, ? and \)
16  */
17 export const escapeCharacters = (text: string) => text.replace(/([*?])/g, '\\$1').replace(/\\/g, '\\\\');
19 /**
20  * Unescape the sieve specific characters (*, ? and \)
21  */
22 export const unescapeCharacters = (text: string) => text.replace(/\\\\/g, '\\').replace(/\\([?*])/g, '$1');
24 /**
25  * Escapes sieve variables
26  */
27 export const escapeVariables = (text: string): EscapeVariableType => {
28     const regex = /\$({[\w._]+})/g;
29     if (!text.match(regex)) {
30         return text;
31     }
33     return {
34         Value: text.replace(regex, '${dollar}$1'),
35         Type: 'VariableString',
36     };
39 /**
40  * Unescape sieve variables
41  */
42 export const unescapeVariables = (text: string | ReturnValue) => {
43     if (typeof text === 'string') {
44         return text;
45     }
46     const { Value: value, Type: type } = text;
47     if (type !== 'VariableString' || value.match(/\${(?!dollar)[\w._]+}/)) {
48         return;
49     }
51     const regex = /\${dollar}({[\w._]+})/g;
53     return text.Value.replace(regex, '$$$1');
56 /**
57  * Remove duplicates in array.
58  */
59 export const unique = <T>(arr: T[]) => [...new Set(arr)];
61 /**
62  * Find last value that pass the given callback
63  */
64 export const findLatest = <T>(arr: T[], callback: (item: T) => {}) => {
65     let i = arr.length;
66     while (i--) {
67         if (callback(arr[i])) {
68             return arr[i];
69         }
70     }