-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
72 lines (66 loc) · 2.25 KB
/
index.js
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
function mapBreakpointsOnClasses(dirValue, origClasses = "") {
const screens = Object.keys(dirValue);
const regex = /\s+/g;
screens.forEach(screen => {
const screenClasses = " " + dirValue[screen];
origClasses += screenClasses.replace(regex, ` ${screen}:`);
});
return origClasses;
}
// Server side directive
// In NuxtJS it is needed for Universal mode
export const server = (node, dir) => {
node.data.class += mapBreakpointsOnClasses(dir.value);
};
// Client side directive (SPA mode)
// In NuxtJS it is needed for SPA & Universal mode
export const client = {
bind(el, dir) {
el.className += mapBreakpointsOnClasses(dir.value);
},
update(el, dir, vnode) {
const classes = vnode.data.staticClass + " " + vnode.data.class;
el.className = mapBreakpointsOnClasses(dir.value, classes);
}
};
// This is extractor for PurgeCSS
export const extractor = {
extractor: class {
static extract(content) {
// clean content from unnecesary spaces
const cleanedContent = content.replace(/\s+/g, ` `);
// get only v-screen directive content
const screenDirectives = cleanedContent.match(
/v-screen=("|'){((?!{|}).)+}("|')/g
);
let whitelabledClasses = "";
if (screenDirectives !== null) {
screenDirectives.forEach(string => {
let valueString = string.match(/{.+}/g)[0];
valueString = valueString
.replace(/\s:/g, ":")
.replace(/:\s/g, '":')
.replace(/,\s/g, ",")
.replace(/{\s/g, "{")
.replace(/'/g, '"')
// .replace(/:/g, '":')
.replace(/{/g, '{"')
.replace(/,/g, ',"');
const valueObject = JSON.parse(valueString);
const screens = Object.keys(valueObject);
screens.forEach(screen => {
const screenClasses = " " + valueObject[screen];
whitelabledClasses += screenClasses.replace(/\s+/g, ` ${screen}:`);
});
});
}
// original - get all strings
const allStrings = content.match(/[A-z0-9-:\\/]+/g);
// prepare computed screen classes
const whitelabledArray = whitelabledClasses.split(" ");
allStrings.push(...whitelabledArray);
return allStrings;
}
},
extensions: ["vue"]
};