-
Notifications
You must be signed in to change notification settings - Fork 0
/
replacer.ts
40 lines (35 loc) · 1.51 KB
/
replacer.ts
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
37
38
39
40
/* Begin: Replacer function */
interface ICssModulesParams {
prefix: string;
suffix: string;
unusedHtmlClasses: string;
unusedSelectors: string;
}
function __escapeRegExp(value: string): string {
return value.replace(/[-\/\\^$*+?.()|[\]{}]/m, "\\$&");
}
function __replaceCssModules({ prefix, suffix, unusedHtmlClasses, unusedSelectors }: ICssModulesParams) {
return function (template: string, styles: object[]): string {
let result: string = template;
styles.forEach((style: object): void => {
for (const [key, value] of Object.entries(style)) {
const matchRegExp: RegExp = new RegExp(`${__escapeRegExp(prefix)}\\b${__escapeRegExp(key)}(?![\\w-])\\b${__escapeRegExp(suffix)}`, "gm");
if (matchRegExp.test(result)) {
matchRegExp.lastIndex = 0;
result = result.replace(matchRegExp, value);
} else if (unusedSelectors) {
console.warn(`Unused selector: ${key}`);
}
}
});
if (unusedHtmlClasses) { // find unused HTML keys
const unusedRegExp: RegExp = new RegExp(`(${__escapeRegExp(prefix)}\\b[\\w-]+\\b${__escapeRegExp(suffix)})`, "gm");
let unusedMatches: RegExpExecArray | null;
while ((unusedMatches = unusedRegExp.exec(result)) !== null) {
console.warn(`Unused HTML-class: ${unusedMatches[1]}`);
}
}
return result;
};
}
/* End: Replacer function */