source: frontend/node_modules/postcss-normalize-whitespace/src/index.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 12 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 2.9 KB
Line 
1'use strict';
2const valueParser = require('postcss-value-parser');
3
4const atrule = 'atrule';
5const decl = 'decl';
6const rule = 'rule';
7const variableFunctions = new Set(['var', 'env', 'constant']);
8
9/**
10 * @param {valueParser.Node} node
11 * @return {void}
12 */
13function reduceCalcWhitespaces(node) {
14 if (node.type === 'space') {
15 node.value = ' ';
16 } else if (node.type === 'function') {
17 if (!variableFunctions.has(node.value.toLowerCase())) {
18 node.before = node.after = '';
19 }
20 }
21}
22/**
23 * @param {valueParser.Node} node
24 * @return {void | false}
25 */
26function reduceWhitespaces(node) {
27 if (node.type === 'space') {
28 node.value = ' ';
29 } else if (node.type === 'div') {
30 node.before = node.after = '';
31 } else if (node.type === 'function') {
32 if (!variableFunctions.has(node.value.toLowerCase())) {
33 node.before = node.after = '';
34 }
35 if (node.value.toLowerCase() === 'calc') {
36 valueParser.walk(node.nodes, reduceCalcWhitespaces);
37 return false;
38 }
39 }
40}
41
42/**
43 * @type {import('postcss').PluginCreator<void>}
44 * @return {import('postcss').Plugin}
45 */
46function pluginCreator() {
47 return {
48 postcssPlugin: 'postcss-normalize-whitespace',
49
50 OnceExit(css) {
51 const cache = new Map();
52
53 css.walk((node) => {
54 const { type } = node;
55
56 if ([decl, rule, atrule].includes(type) && node.raws.before) {
57 node.raws.before = node.raws.before.replace(/\s/g, '');
58 }
59
60 if (type === decl) {
61 // Ensure that !important values do not have any excess whitespace
62 if (node.important) {
63 node.raws.important = '!important';
64 }
65
66 // Remove whitespaces around ie 9 hack
67 node.value = node.value.replace(/\s*(\\9)\s*/, '$1');
68 const value = node.value;
69
70 if (cache.has(value)) {
71 node.value = cache.get(value);
72 } else {
73 const parsed = valueParser(node.value);
74 const result = parsed.walk(reduceWhitespaces).toString();
75
76 // Trim whitespace inside functions & dividers
77 node.value = result;
78 cache.set(value, result);
79 }
80
81 if (node.prop.startsWith('--') && node.value === '') {
82 node.value = ' ';
83 }
84 // Remove extra semicolons and whitespace before the declaration
85 if (node.raws.before) {
86 const prev = node.prev();
87
88 if (prev && prev.type !== rule) {
89 node.raws.before = node.raws.before.replace(/;/g, '');
90 }
91 }
92
93 node.raws.between = ':';
94 node.raws.semicolon = false;
95 } else if (type === rule || type === atrule) {
96 node.raws.between = node.raws.after = '';
97 node.raws.semicolon = false;
98 }
99 });
100
101 // Remove final newline
102 css.raws.after = '';
103 },
104 };
105}
106
107pluginCreator.postcss = true;
108module.exports = pluginCreator;
Note: See TracBrowser for help on using the repository browser.