This repository was archived by the owner on Jul 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
59 lines (48 loc) · 1.34 KB
/
Copy pathindex.js
File metadata and controls
59 lines (48 loc) · 1.34 KB
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
const flattenDeep = require('lodash.flattendeep');
function appendIfNotEmpty(value, arr) {
return value && value.length ? [...arr, value] : arr;
}
function getClassNamesForProp(value, currentProp) {
if (Array.isArray(value)) {
return value.reduce((results, item) => (
appendIfNotEmpty(getClassNamesForProp(item, currentProp), results)
), []);
} else if (value instanceof Function) {
return getClassNamesForProp(value(currentProp));
}
return value === true ? currentProp.name : value;
}
function $classNames(defaultClassName = null) {
const props = this.$props;
const propOptions = this.$options.props;
if (!propOptions) {
return null;
}
if (!this.$_classNames) {
this.$_classNames = Object.entries(propOptions).reduce(
(result, [propName, options]) => {
const { className } = options;
const propValue = !!props[propName];
if (!className || !propValue) {
return result;
}
return appendIfNotEmpty(getClassNamesForProp(className, {
props,
name: propName,
value: propValue,
}), result);
},
[],
);
}
return this.$_classNames.length
? flattenDeep(this.$_classNames)
: defaultClassName;
}
const mixin = {
methods: { $classNames },
};
module.exports = {
install: Vue => Vue.mixin(mixin),
mixin,
};