source: frontend/node_modules/postcss-import/lib/parse-statements.js

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

Fix frontend appearance

  • Property mode set to 100644
File size: 3.7 KB
Line 
1"use strict"
2
3// external tooling
4const valueParser = require("postcss-value-parser")
5
6// extended tooling
7const { stringify } = valueParser
8
9function split(params, start) {
10 const list = []
11 const last = params.reduce((item, node, index) => {
12 if (index < start) return ""
13 if (node.type === "div" && node.value === ",") {
14 list.push(item)
15 return ""
16 }
17 return item + stringify(node)
18 }, "")
19 list.push(last)
20 return list
21}
22
23module.exports = function (result, styles) {
24 const statements = []
25 let nodes = []
26
27 styles.each(node => {
28 let stmt
29 if (node.type === "atrule") {
30 if (node.name === "import") stmt = parseImport(result, node)
31 else if (node.name === "media") stmt = parseMedia(result, node)
32 else if (node.name === "charset") stmt = parseCharset(result, node)
33 }
34
35 if (stmt) {
36 if (nodes.length) {
37 statements.push({
38 type: "nodes",
39 nodes,
40 media: [],
41 layer: [],
42 })
43 nodes = []
44 }
45 statements.push(stmt)
46 } else nodes.push(node)
47 })
48
49 if (nodes.length) {
50 statements.push({
51 type: "nodes",
52 nodes,
53 media: [],
54 layer: [],
55 })
56 }
57
58 return statements
59}
60
61function parseMedia(result, atRule) {
62 const params = valueParser(atRule.params).nodes
63 return {
64 type: "media",
65 node: atRule,
66 media: split(params, 0),
67 layer: [],
68 }
69}
70
71function parseCharset(result, atRule) {
72 if (atRule.prev()) {
73 return result.warn("@charset must precede all other statements", {
74 node: atRule,
75 })
76 }
77 return {
78 type: "charset",
79 node: atRule,
80 media: [],
81 layer: [],
82 }
83}
84
85function parseImport(result, atRule) {
86 let prev = atRule.prev()
87 if (prev) {
88 do {
89 if (
90 prev.type !== "comment" &&
91 (prev.type !== "atrule" ||
92 (prev.name !== "import" &&
93 prev.name !== "charset" &&
94 !(prev.name === "layer" && !prev.nodes)))
95 ) {
96 return result.warn(
97 "@import must precede all other statements (besides @charset or empty @layer)",
98 { node: atRule }
99 )
100 }
101 prev = prev.prev()
102 } while (prev)
103 }
104
105 if (atRule.nodes) {
106 return result.warn(
107 "It looks like you didn't end your @import statement correctly. " +
108 "Child nodes are attached to it.",
109 { node: atRule }
110 )
111 }
112
113 const params = valueParser(atRule.params).nodes
114 const stmt = {
115 type: "import",
116 node: atRule,
117 media: [],
118 layer: [],
119 }
120
121 // prettier-ignore
122 if (
123 !params.length ||
124 (
125 params[0].type !== "string" ||
126 !params[0].value
127 ) &&
128 (
129 params[0].type !== "function" ||
130 params[0].value !== "url" ||
131 !params[0].nodes.length ||
132 !params[0].nodes[0].value
133 )
134 ) {
135 return result.warn(`Unable to find uri in '${ atRule.toString() }'`, {
136 node: atRule,
137 })
138 }
139
140 if (params[0].type === "string") stmt.uri = params[0].value
141 else stmt.uri = params[0].nodes[0].value
142 stmt.fullUri = stringify(params[0])
143
144 let remainder = params
145 if (remainder.length > 2) {
146 if (
147 (remainder[2].type === "word" || remainder[2].type === "function") &&
148 remainder[2].value === "layer"
149 ) {
150 if (remainder[1].type !== "space") {
151 return result.warn("Invalid import layer statement", { node: atRule })
152 }
153
154 if (remainder[2].nodes) {
155 stmt.layer = [stringify(remainder[2].nodes)]
156 } else {
157 stmt.layer = [""]
158 }
159 remainder = remainder.slice(2)
160 }
161 }
162
163 if (remainder.length > 2) {
164 if (remainder[1].type !== "space") {
165 return result.warn("Invalid import media statement", { node: atRule })
166 }
167
168 stmt.media = split(remainder, 2)
169 }
170
171 return stmt
172}
Note: See TracBrowser for help on using the repository browser.