@depup/postcss 8.5.8-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +31 -0
- package/changes.json +10 -0
- package/lib/at-rule.d.ts +140 -0
- package/lib/at-rule.js +25 -0
- package/lib/comment.d.ts +68 -0
- package/lib/comment.js +13 -0
- package/lib/container.d.ts +483 -0
- package/lib/container.js +447 -0
- package/lib/css-syntax-error.d.ts +248 -0
- package/lib/css-syntax-error.js +133 -0
- package/lib/declaration.d.ts +151 -0
- package/lib/declaration.js +24 -0
- package/lib/document.d.ts +69 -0
- package/lib/document.js +33 -0
- package/lib/fromJSON.d.ts +9 -0
- package/lib/fromJSON.js +54 -0
- package/lib/input.d.ts +227 -0
- package/lib/input.js +265 -0
- package/lib/lazy-result.d.ts +190 -0
- package/lib/lazy-result.js +550 -0
- package/lib/list.d.ts +60 -0
- package/lib/list.js +58 -0
- package/lib/map-generator.js +376 -0
- package/lib/no-work-result.d.ts +46 -0
- package/lib/no-work-result.js +137 -0
- package/lib/node.d.ts +556 -0
- package/lib/node.js +449 -0
- package/lib/parse.d.ts +9 -0
- package/lib/parse.js +42 -0
- package/lib/parser.js +611 -0
- package/lib/postcss.d.mts +69 -0
- package/lib/postcss.d.ts +458 -0
- package/lib/postcss.js +101 -0
- package/lib/postcss.mjs +30 -0
- package/lib/previous-map.d.ts +81 -0
- package/lib/previous-map.js +144 -0
- package/lib/processor.d.ts +115 -0
- package/lib/processor.js +67 -0
- package/lib/result.d.ts +205 -0
- package/lib/result.js +42 -0
- package/lib/root.d.ts +87 -0
- package/lib/root.js +61 -0
- package/lib/rule.d.ts +126 -0
- package/lib/rule.js +27 -0
- package/lib/stringifier.d.ts +46 -0
- package/lib/stringifier.js +353 -0
- package/lib/stringify.d.ts +9 -0
- package/lib/stringify.js +11 -0
- package/lib/symbols.js +5 -0
- package/lib/terminal-highlight.js +70 -0
- package/lib/tokenize.js +266 -0
- package/lib/warn-once.js +13 -0
- package/lib/warning.d.ts +147 -0
- package/lib/warning.js +37 -0
- package/package.json +104 -0
package/lib/node.js
ADDED
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
let CssSyntaxError = require('./css-syntax-error')
|
|
4
|
+
let Stringifier = require('./stringifier')
|
|
5
|
+
let stringify = require('./stringify')
|
|
6
|
+
let { isClean, my } = require('./symbols')
|
|
7
|
+
|
|
8
|
+
function cloneNode(obj, parent) {
|
|
9
|
+
let cloned = new obj.constructor()
|
|
10
|
+
|
|
11
|
+
for (let i in obj) {
|
|
12
|
+
if (!Object.prototype.hasOwnProperty.call(obj, i)) {
|
|
13
|
+
/* c8 ignore next 2 */
|
|
14
|
+
continue
|
|
15
|
+
}
|
|
16
|
+
if (i === 'proxyCache') continue
|
|
17
|
+
let value = obj[i]
|
|
18
|
+
let type = typeof value
|
|
19
|
+
|
|
20
|
+
if (i === 'parent' && type === 'object') {
|
|
21
|
+
if (parent) cloned[i] = parent
|
|
22
|
+
} else if (i === 'source') {
|
|
23
|
+
cloned[i] = value
|
|
24
|
+
} else if (Array.isArray(value)) {
|
|
25
|
+
cloned[i] = value.map(j => cloneNode(j, cloned))
|
|
26
|
+
} else {
|
|
27
|
+
if (type === 'object' && value !== null) value = cloneNode(value)
|
|
28
|
+
cloned[i] = value
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return cloned
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function sourceOffset(inputCSS, position) {
|
|
36
|
+
// Not all custom syntaxes support `offset` in `source.start` and `source.end`
|
|
37
|
+
if (position && typeof position.offset !== 'undefined') {
|
|
38
|
+
return position.offset
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let column = 1
|
|
42
|
+
let line = 1
|
|
43
|
+
let offset = 0
|
|
44
|
+
|
|
45
|
+
for (let i = 0; i < inputCSS.length; i++) {
|
|
46
|
+
if (line === position.line && column === position.column) {
|
|
47
|
+
offset = i
|
|
48
|
+
break
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (inputCSS[i] === '\n') {
|
|
52
|
+
column = 1
|
|
53
|
+
line += 1
|
|
54
|
+
} else {
|
|
55
|
+
column += 1
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return offset
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
class Node {
|
|
63
|
+
get proxyOf() {
|
|
64
|
+
return this
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
constructor(defaults = {}) {
|
|
68
|
+
this.raws = {}
|
|
69
|
+
this[isClean] = false
|
|
70
|
+
this[my] = true
|
|
71
|
+
|
|
72
|
+
for (let name in defaults) {
|
|
73
|
+
if (name === 'nodes') {
|
|
74
|
+
this.nodes = []
|
|
75
|
+
for (let node of defaults[name]) {
|
|
76
|
+
if (typeof node.clone === 'function') {
|
|
77
|
+
this.append(node.clone())
|
|
78
|
+
} else {
|
|
79
|
+
this.append(node)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
this[name] = defaults[name]
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
addToError(error) {
|
|
89
|
+
error.postcssNode = this
|
|
90
|
+
if (error.stack && this.source && /\n\s{4}at /.test(error.stack)) {
|
|
91
|
+
let s = this.source
|
|
92
|
+
error.stack = error.stack.replace(
|
|
93
|
+
/\n\s{4}at /,
|
|
94
|
+
`$&${s.input.from}:${s.start.line}:${s.start.column}$&`
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
return error
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
after(add) {
|
|
101
|
+
this.parent.insertAfter(this, add)
|
|
102
|
+
return this
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
assign(overrides = {}) {
|
|
106
|
+
for (let name in overrides) {
|
|
107
|
+
this[name] = overrides[name]
|
|
108
|
+
}
|
|
109
|
+
return this
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
before(add) {
|
|
113
|
+
this.parent.insertBefore(this, add)
|
|
114
|
+
return this
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
cleanRaws(keepBetween) {
|
|
118
|
+
delete this.raws.before
|
|
119
|
+
delete this.raws.after
|
|
120
|
+
if (!keepBetween) delete this.raws.between
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
clone(overrides = {}) {
|
|
124
|
+
let cloned = cloneNode(this)
|
|
125
|
+
for (let name in overrides) {
|
|
126
|
+
cloned[name] = overrides[name]
|
|
127
|
+
}
|
|
128
|
+
return cloned
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
cloneAfter(overrides = {}) {
|
|
132
|
+
let cloned = this.clone(overrides)
|
|
133
|
+
this.parent.insertAfter(this, cloned)
|
|
134
|
+
return cloned
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
cloneBefore(overrides = {}) {
|
|
138
|
+
let cloned = this.clone(overrides)
|
|
139
|
+
this.parent.insertBefore(this, cloned)
|
|
140
|
+
return cloned
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
error(message, opts = {}) {
|
|
144
|
+
if (this.source) {
|
|
145
|
+
let { end, start } = this.rangeBy(opts)
|
|
146
|
+
return this.source.input.error(
|
|
147
|
+
message,
|
|
148
|
+
{ column: start.column, line: start.line },
|
|
149
|
+
{ column: end.column, line: end.line },
|
|
150
|
+
opts
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
return new CssSyntaxError(message)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
getProxyProcessor() {
|
|
157
|
+
return {
|
|
158
|
+
get(node, prop) {
|
|
159
|
+
if (prop === 'proxyOf') {
|
|
160
|
+
return node
|
|
161
|
+
} else if (prop === 'root') {
|
|
162
|
+
return () => node.root().toProxy()
|
|
163
|
+
} else {
|
|
164
|
+
return node[prop]
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
|
|
168
|
+
set(node, prop, value) {
|
|
169
|
+
if (node[prop] === value) return true
|
|
170
|
+
node[prop] = value
|
|
171
|
+
if (
|
|
172
|
+
prop === 'prop' ||
|
|
173
|
+
prop === 'value' ||
|
|
174
|
+
prop === 'name' ||
|
|
175
|
+
prop === 'params' ||
|
|
176
|
+
prop === 'important' ||
|
|
177
|
+
/* c8 ignore next */
|
|
178
|
+
prop === 'text'
|
|
179
|
+
) {
|
|
180
|
+
node.markDirty()
|
|
181
|
+
}
|
|
182
|
+
return true
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* c8 ignore next 3 */
|
|
188
|
+
markClean() {
|
|
189
|
+
this[isClean] = true
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
markDirty() {
|
|
193
|
+
if (this[isClean]) {
|
|
194
|
+
this[isClean] = false
|
|
195
|
+
let next = this
|
|
196
|
+
while ((next = next.parent)) {
|
|
197
|
+
next[isClean] = false
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
next() {
|
|
203
|
+
if (!this.parent) return undefined
|
|
204
|
+
let index = this.parent.index(this)
|
|
205
|
+
return this.parent.nodes[index + 1]
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
positionBy(opts = {}) {
|
|
209
|
+
let pos = this.source.start
|
|
210
|
+
if (opts.index) {
|
|
211
|
+
pos = this.positionInside(opts.index)
|
|
212
|
+
} else if (opts.word) {
|
|
213
|
+
let inputString =
|
|
214
|
+
'document' in this.source.input
|
|
215
|
+
? this.source.input.document
|
|
216
|
+
: this.source.input.css
|
|
217
|
+
let stringRepresentation = inputString.slice(
|
|
218
|
+
sourceOffset(inputString, this.source.start),
|
|
219
|
+
sourceOffset(inputString, this.source.end)
|
|
220
|
+
)
|
|
221
|
+
let index = stringRepresentation.indexOf(opts.word)
|
|
222
|
+
if (index !== -1) pos = this.positionInside(index)
|
|
223
|
+
}
|
|
224
|
+
return pos
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
positionInside(index) {
|
|
228
|
+
let column = this.source.start.column
|
|
229
|
+
let line = this.source.start.line
|
|
230
|
+
let inputString =
|
|
231
|
+
'document' in this.source.input
|
|
232
|
+
? this.source.input.document
|
|
233
|
+
: this.source.input.css
|
|
234
|
+
let offset = sourceOffset(inputString, this.source.start)
|
|
235
|
+
let end = offset + index
|
|
236
|
+
|
|
237
|
+
for (let i = offset; i < end; i++) {
|
|
238
|
+
if (inputString[i] === '\n') {
|
|
239
|
+
column = 1
|
|
240
|
+
line += 1
|
|
241
|
+
} else {
|
|
242
|
+
column += 1
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return { column, line, offset: end }
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
prev() {
|
|
250
|
+
if (!this.parent) return undefined
|
|
251
|
+
let index = this.parent.index(this)
|
|
252
|
+
return this.parent.nodes[index - 1]
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
rangeBy(opts = {}) {
|
|
256
|
+
let inputString =
|
|
257
|
+
'document' in this.source.input
|
|
258
|
+
? this.source.input.document
|
|
259
|
+
: this.source.input.css
|
|
260
|
+
let start = {
|
|
261
|
+
column: this.source.start.column,
|
|
262
|
+
line: this.source.start.line,
|
|
263
|
+
offset: sourceOffset(inputString, this.source.start)
|
|
264
|
+
}
|
|
265
|
+
let end = this.source.end
|
|
266
|
+
? {
|
|
267
|
+
column: this.source.end.column + 1,
|
|
268
|
+
line: this.source.end.line,
|
|
269
|
+
offset:
|
|
270
|
+
typeof this.source.end.offset === 'number'
|
|
271
|
+
? // `source.end.offset` is exclusive, so we don't need to add 1
|
|
272
|
+
this.source.end.offset
|
|
273
|
+
: // Since line/column in this.source.end is inclusive,
|
|
274
|
+
// the `sourceOffset(... , this.source.end)` returns an inclusive offset.
|
|
275
|
+
// So, we add 1 to convert it to exclusive.
|
|
276
|
+
sourceOffset(inputString, this.source.end) + 1
|
|
277
|
+
}
|
|
278
|
+
: {
|
|
279
|
+
column: start.column + 1,
|
|
280
|
+
line: start.line,
|
|
281
|
+
offset: start.offset + 1
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (opts.word) {
|
|
285
|
+
let stringRepresentation = inputString.slice(
|
|
286
|
+
sourceOffset(inputString, this.source.start),
|
|
287
|
+
sourceOffset(inputString, this.source.end)
|
|
288
|
+
)
|
|
289
|
+
let index = stringRepresentation.indexOf(opts.word)
|
|
290
|
+
if (index !== -1) {
|
|
291
|
+
start = this.positionInside(index)
|
|
292
|
+
end = this.positionInside(index + opts.word.length)
|
|
293
|
+
}
|
|
294
|
+
} else {
|
|
295
|
+
if (opts.start) {
|
|
296
|
+
start = {
|
|
297
|
+
column: opts.start.column,
|
|
298
|
+
line: opts.start.line,
|
|
299
|
+
offset: sourceOffset(inputString, opts.start)
|
|
300
|
+
}
|
|
301
|
+
} else if (opts.index) {
|
|
302
|
+
start = this.positionInside(opts.index)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (opts.end) {
|
|
306
|
+
end = {
|
|
307
|
+
column: opts.end.column,
|
|
308
|
+
line: opts.end.line,
|
|
309
|
+
offset: sourceOffset(inputString, opts.end)
|
|
310
|
+
}
|
|
311
|
+
} else if (typeof opts.endIndex === 'number') {
|
|
312
|
+
end = this.positionInside(opts.endIndex)
|
|
313
|
+
} else if (opts.index) {
|
|
314
|
+
end = this.positionInside(opts.index + 1)
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (
|
|
319
|
+
end.line < start.line ||
|
|
320
|
+
(end.line === start.line && end.column <= start.column)
|
|
321
|
+
) {
|
|
322
|
+
end = {
|
|
323
|
+
column: start.column + 1,
|
|
324
|
+
line: start.line,
|
|
325
|
+
offset: start.offset + 1
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return { end, start }
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
raw(prop, defaultType) {
|
|
333
|
+
let str = new Stringifier()
|
|
334
|
+
return str.raw(this, prop, defaultType)
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
remove() {
|
|
338
|
+
if (this.parent) {
|
|
339
|
+
this.parent.removeChild(this)
|
|
340
|
+
}
|
|
341
|
+
this.parent = undefined
|
|
342
|
+
return this
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
replaceWith(...nodes) {
|
|
346
|
+
if (this.parent) {
|
|
347
|
+
let bookmark = this
|
|
348
|
+
let foundSelf = false
|
|
349
|
+
for (let node of nodes) {
|
|
350
|
+
if (node === this) {
|
|
351
|
+
foundSelf = true
|
|
352
|
+
} else if (foundSelf) {
|
|
353
|
+
this.parent.insertAfter(bookmark, node)
|
|
354
|
+
bookmark = node
|
|
355
|
+
} else {
|
|
356
|
+
this.parent.insertBefore(bookmark, node)
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
if (!foundSelf) {
|
|
361
|
+
this.remove()
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return this
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
root() {
|
|
369
|
+
let result = this
|
|
370
|
+
while (result.parent && result.parent.type !== 'document') {
|
|
371
|
+
result = result.parent
|
|
372
|
+
}
|
|
373
|
+
return result
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
toJSON(_, inputs) {
|
|
377
|
+
let fixed = {}
|
|
378
|
+
let emitInputs = inputs == null
|
|
379
|
+
inputs = inputs || new Map()
|
|
380
|
+
let inputsNextIndex = 0
|
|
381
|
+
|
|
382
|
+
for (let name in this) {
|
|
383
|
+
if (!Object.prototype.hasOwnProperty.call(this, name)) {
|
|
384
|
+
/* c8 ignore next 2 */
|
|
385
|
+
continue
|
|
386
|
+
}
|
|
387
|
+
if (name === 'parent' || name === 'proxyCache') continue
|
|
388
|
+
let value = this[name]
|
|
389
|
+
|
|
390
|
+
if (Array.isArray(value)) {
|
|
391
|
+
fixed[name] = value.map(i => {
|
|
392
|
+
if (typeof i === 'object' && i.toJSON) {
|
|
393
|
+
return i.toJSON(null, inputs)
|
|
394
|
+
} else {
|
|
395
|
+
return i
|
|
396
|
+
}
|
|
397
|
+
})
|
|
398
|
+
} else if (typeof value === 'object' && value.toJSON) {
|
|
399
|
+
fixed[name] = value.toJSON(null, inputs)
|
|
400
|
+
} else if (name === 'source') {
|
|
401
|
+
if (value == null) continue
|
|
402
|
+
let inputId = inputs.get(value.input)
|
|
403
|
+
if (inputId == null) {
|
|
404
|
+
inputId = inputsNextIndex
|
|
405
|
+
inputs.set(value.input, inputsNextIndex)
|
|
406
|
+
inputsNextIndex++
|
|
407
|
+
}
|
|
408
|
+
fixed[name] = {
|
|
409
|
+
end: value.end,
|
|
410
|
+
inputId,
|
|
411
|
+
start: value.start
|
|
412
|
+
}
|
|
413
|
+
} else {
|
|
414
|
+
fixed[name] = value
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
if (emitInputs) {
|
|
419
|
+
fixed.inputs = [...inputs.keys()].map(input => input.toJSON())
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
return fixed
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
toProxy() {
|
|
426
|
+
if (!this.proxyCache) {
|
|
427
|
+
this.proxyCache = new Proxy(this, this.getProxyProcessor())
|
|
428
|
+
}
|
|
429
|
+
return this.proxyCache
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
toString(stringifier = stringify) {
|
|
433
|
+
if (stringifier.stringify) stringifier = stringifier.stringify
|
|
434
|
+
let result = ''
|
|
435
|
+
stringifier(this, i => {
|
|
436
|
+
result += i
|
|
437
|
+
})
|
|
438
|
+
return result
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
warn(result, text, opts = {}) {
|
|
442
|
+
let data = { node: this }
|
|
443
|
+
for (let i in opts) data[i] = opts[i]
|
|
444
|
+
return result.warn(text, data)
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
module.exports = Node
|
|
449
|
+
Node.default = Node
|
package/lib/parse.d.ts
ADDED
package/lib/parse.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
let Container = require('./container')
|
|
4
|
+
let Input = require('./input')
|
|
5
|
+
let Parser = require('./parser')
|
|
6
|
+
|
|
7
|
+
function parse(css, opts) {
|
|
8
|
+
let input = new Input(css, opts)
|
|
9
|
+
let parser = new Parser(input)
|
|
10
|
+
try {
|
|
11
|
+
parser.parse()
|
|
12
|
+
} catch (e) {
|
|
13
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
14
|
+
if (e.name === 'CssSyntaxError' && opts && opts.from) {
|
|
15
|
+
if (/\.scss$/i.test(opts.from)) {
|
|
16
|
+
e.message +=
|
|
17
|
+
'\nYou tried to parse SCSS with ' +
|
|
18
|
+
'the standard CSS parser; ' +
|
|
19
|
+
'try again with the postcss-scss parser'
|
|
20
|
+
} else if (/\.sass/i.test(opts.from)) {
|
|
21
|
+
e.message +=
|
|
22
|
+
'\nYou tried to parse Sass with ' +
|
|
23
|
+
'the standard CSS parser; ' +
|
|
24
|
+
'try again with the postcss-sass parser'
|
|
25
|
+
} else if (/\.less$/i.test(opts.from)) {
|
|
26
|
+
e.message +=
|
|
27
|
+
'\nYou tried to parse Less with ' +
|
|
28
|
+
'the standard CSS parser; ' +
|
|
29
|
+
'try again with the postcss-less parser'
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throw e
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return parser.root
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
module.exports = parse
|
|
40
|
+
parse.default = parse
|
|
41
|
+
|
|
42
|
+
Container.registerParse(parse)
|