index.js
2.23 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
'use strict';
const valueParser = require('postcss-value-parser');
const minifyWeight = require('./lib/minify-weight');
const minifyFamily = require('./lib/minify-family');
const minifyFont = require('./lib/minify-font');
/**
* @param {string} value
* @return {boolean}
*/
function hasVariableFunction(value) {
const lowerCasedValue = value.toLowerCase();
return lowerCasedValue.includes('var(') || lowerCasedValue.includes('env(');
}
/**
* @param {string} prop
* @param {string} value
* @param {Options} opts
* @return {string}
*/
function transform(prop, value, opts) {
let lowerCasedProp = prop.toLowerCase();
if (lowerCasedProp === 'font-weight' && !hasVariableFunction(value)) {
return minifyWeight(value);
} else if (lowerCasedProp === 'font-family' && !hasVariableFunction(value)) {
const tree = valueParser(value);
tree.nodes = minifyFamily(tree.nodes, opts);
return tree.toString();
} else if (lowerCasedProp === 'font') {
const tree = valueParser(value);
tree.nodes = minifyFont(tree.nodes, opts);
return tree.toString();
}
return value;
}
/** @typedef {{removeAfterKeyword?: boolean, removeDuplicates?: boolean, removeQuotes?: boolean}} Options */
/**
* @type {import('postcss').PluginCreator<Options>}
* @param {Options} opts
* @return {import('postcss').Plugin}
*/
function pluginCreator(opts) {
opts = Object.assign(
{},
{
removeAfterKeyword: false,
removeDuplicates: true,
removeQuotes: true,
},
opts
);
return {
postcssPlugin: 'postcss-minify-font-values',
prepare() {
const cache = new Map();
return {
OnceExit(css) {
css.walkDecls(/font/i, (decl) => {
const value = decl.value;
if (!value) {
return;
}
const prop = decl.prop;
const cacheKey = `${prop}|${value}`;
if (cache.has(cacheKey)) {
decl.value = cache.get(cacheKey);
return;
}
const newValue = transform(prop, value, opts);
decl.value = newValue;
cache.set(cacheKey, newValue);
});
},
};
},
};
}
pluginCreator.postcss = true;
module.exports = pluginCreator;