@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.
Files changed (56) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +31 -0
  3. package/changes.json +10 -0
  4. package/lib/at-rule.d.ts +140 -0
  5. package/lib/at-rule.js +25 -0
  6. package/lib/comment.d.ts +68 -0
  7. package/lib/comment.js +13 -0
  8. package/lib/container.d.ts +483 -0
  9. package/lib/container.js +447 -0
  10. package/lib/css-syntax-error.d.ts +248 -0
  11. package/lib/css-syntax-error.js +133 -0
  12. package/lib/declaration.d.ts +151 -0
  13. package/lib/declaration.js +24 -0
  14. package/lib/document.d.ts +69 -0
  15. package/lib/document.js +33 -0
  16. package/lib/fromJSON.d.ts +9 -0
  17. package/lib/fromJSON.js +54 -0
  18. package/lib/input.d.ts +227 -0
  19. package/lib/input.js +265 -0
  20. package/lib/lazy-result.d.ts +190 -0
  21. package/lib/lazy-result.js +550 -0
  22. package/lib/list.d.ts +60 -0
  23. package/lib/list.js +58 -0
  24. package/lib/map-generator.js +376 -0
  25. package/lib/no-work-result.d.ts +46 -0
  26. package/lib/no-work-result.js +137 -0
  27. package/lib/node.d.ts +556 -0
  28. package/lib/node.js +449 -0
  29. package/lib/parse.d.ts +9 -0
  30. package/lib/parse.js +42 -0
  31. package/lib/parser.js +611 -0
  32. package/lib/postcss.d.mts +69 -0
  33. package/lib/postcss.d.ts +458 -0
  34. package/lib/postcss.js +101 -0
  35. package/lib/postcss.mjs +30 -0
  36. package/lib/previous-map.d.ts +81 -0
  37. package/lib/previous-map.js +144 -0
  38. package/lib/processor.d.ts +115 -0
  39. package/lib/processor.js +67 -0
  40. package/lib/result.d.ts +205 -0
  41. package/lib/result.js +42 -0
  42. package/lib/root.d.ts +87 -0
  43. package/lib/root.js +61 -0
  44. package/lib/rule.d.ts +126 -0
  45. package/lib/rule.js +27 -0
  46. package/lib/stringifier.d.ts +46 -0
  47. package/lib/stringifier.js +353 -0
  48. package/lib/stringify.d.ts +9 -0
  49. package/lib/stringify.js +11 -0
  50. package/lib/symbols.js +5 -0
  51. package/lib/terminal-highlight.js +70 -0
  52. package/lib/tokenize.js +266 -0
  53. package/lib/warn-once.js +13 -0
  54. package/lib/warning.d.ts +147 -0
  55. package/lib/warning.js +37 -0
  56. package/package.json +104 -0
@@ -0,0 +1,376 @@
1
+ 'use strict'
2
+
3
+ let { dirname, relative, resolve, sep } = require('path')
4
+ let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')
5
+ let { pathToFileURL } = require('url')
6
+
7
+ let Input = require('./input')
8
+
9
+ let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)
10
+ let pathAvailable = Boolean(dirname && resolve && relative && sep)
11
+
12
+ class MapGenerator {
13
+ constructor(stringify, root, opts, cssString) {
14
+ this.stringify = stringify
15
+ this.mapOpts = opts.map || {}
16
+ this.root = root
17
+ this.opts = opts
18
+ this.css = cssString
19
+ this.originalCSS = cssString
20
+ this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute
21
+
22
+ this.memoizedFileURLs = new Map()
23
+ this.memoizedPaths = new Map()
24
+ this.memoizedURLs = new Map()
25
+ }
26
+
27
+ addAnnotation() {
28
+ let content
29
+
30
+ if (this.isInline()) {
31
+ content =
32
+ 'data:application/json;base64,' + this.toBase64(this.map.toString())
33
+ } else if (typeof this.mapOpts.annotation === 'string') {
34
+ content = this.mapOpts.annotation
35
+ } else if (typeof this.mapOpts.annotation === 'function') {
36
+ content = this.mapOpts.annotation(this.opts.to, this.root)
37
+ } else {
38
+ content = this.outputFile() + '.map'
39
+ }
40
+ let eol = '\n'
41
+ if (this.css.includes('\r\n')) eol = '\r\n'
42
+
43
+ this.css += eol + '/*# sourceMappingURL=' + content + ' */'
44
+ }
45
+
46
+ applyPrevMaps() {
47
+ for (let prev of this.previous()) {
48
+ let from = this.toUrl(this.path(prev.file))
49
+ let root = prev.root || dirname(prev.file)
50
+ let map
51
+
52
+ if (this.mapOpts.sourcesContent === false) {
53
+ map = new SourceMapConsumer(prev.text)
54
+ if (map.sourcesContent) {
55
+ map.sourcesContent = null
56
+ }
57
+ } else {
58
+ map = prev.consumer()
59
+ }
60
+
61
+ this.map.applySourceMap(map, from, this.toUrl(this.path(root)))
62
+ }
63
+ }
64
+
65
+ clearAnnotation() {
66
+ if (this.mapOpts.annotation === false) return
67
+
68
+ if (this.root) {
69
+ let node
70
+ for (let i = this.root.nodes.length - 1; i >= 0; i--) {
71
+ node = this.root.nodes[i]
72
+ if (node.type !== 'comment') continue
73
+ if (node.text.startsWith('# sourceMappingURL=')) {
74
+ this.root.removeChild(i)
75
+ }
76
+ }
77
+ } else if (this.css) {
78
+ let startIndex
79
+ while ((startIndex = this.css.lastIndexOf('/*#')) !== -1) {
80
+ let endIndex = this.css.indexOf('*/', startIndex + 3)
81
+ if (endIndex === -1) break
82
+ while (startIndex > 0 && this.css[startIndex - 1] === '\n') {
83
+ startIndex--
84
+ }
85
+ this.css = this.css.slice(0, startIndex) + this.css.slice(endIndex + 2)
86
+ }
87
+ }
88
+ }
89
+
90
+ generate() {
91
+ this.clearAnnotation()
92
+ if (pathAvailable && sourceMapAvailable && this.isMap()) {
93
+ return this.generateMap()
94
+ } else {
95
+ let result = ''
96
+ this.stringify(this.root, i => {
97
+ result += i
98
+ })
99
+ return [result]
100
+ }
101
+ }
102
+
103
+ generateMap() {
104
+ if (this.root) {
105
+ this.generateString()
106
+ } else if (this.previous().length === 1) {
107
+ let prev = this.previous()[0].consumer()
108
+ prev.file = this.outputFile()
109
+ this.map = SourceMapGenerator.fromSourceMap(prev, {
110
+ ignoreInvalidMapping: true
111
+ })
112
+ } else {
113
+ this.map = new SourceMapGenerator({
114
+ file: this.outputFile(),
115
+ ignoreInvalidMapping: true
116
+ })
117
+ this.map.addMapping({
118
+ generated: { column: 0, line: 1 },
119
+ original: { column: 0, line: 1 },
120
+ source: this.opts.from
121
+ ? this.toUrl(this.path(this.opts.from))
122
+ : '<no source>'
123
+ })
124
+ }
125
+
126
+ if (this.isSourcesContent()) this.setSourcesContent()
127
+ if (this.root && this.previous().length > 0) this.applyPrevMaps()
128
+ if (this.isAnnotation()) this.addAnnotation()
129
+
130
+ if (this.isInline()) {
131
+ return [this.css]
132
+ } else {
133
+ return [this.css, this.map]
134
+ }
135
+ }
136
+
137
+ generateString() {
138
+ this.css = ''
139
+ this.map = new SourceMapGenerator({
140
+ file: this.outputFile(),
141
+ ignoreInvalidMapping: true
142
+ })
143
+
144
+ let line = 1
145
+ let column = 1
146
+
147
+ let noSource = '<no source>'
148
+ let mapping = {
149
+ generated: { column: 0, line: 0 },
150
+ original: { column: 0, line: 0 },
151
+ source: ''
152
+ }
153
+
154
+ let last, lines
155
+ this.stringify(this.root, (str, node, type) => {
156
+ this.css += str
157
+
158
+ if (node && type !== 'end') {
159
+ mapping.generated.line = line
160
+ mapping.generated.column = column - 1
161
+ if (node.source && node.source.start) {
162
+ mapping.source = this.sourcePath(node)
163
+ mapping.original.line = node.source.start.line
164
+ mapping.original.column = node.source.start.column - 1
165
+ this.map.addMapping(mapping)
166
+ } else {
167
+ mapping.source = noSource
168
+ mapping.original.line = 1
169
+ mapping.original.column = 0
170
+ this.map.addMapping(mapping)
171
+ }
172
+ }
173
+
174
+ lines = str.match(/\n/g)
175
+ if (lines) {
176
+ line += lines.length
177
+ last = str.lastIndexOf('\n')
178
+ column = str.length - last
179
+ } else {
180
+ column += str.length
181
+ }
182
+
183
+ if (node && type !== 'start') {
184
+ let p = node.parent || { raws: {} }
185
+ let childless =
186
+ node.type === 'decl' || (node.type === 'atrule' && !node.nodes)
187
+ if (!childless || node !== p.last || p.raws.semicolon) {
188
+ if (node.source && node.source.end) {
189
+ mapping.source = this.sourcePath(node)
190
+ mapping.original.line = node.source.end.line
191
+ mapping.original.column = node.source.end.column - 1
192
+ mapping.generated.line = line
193
+ mapping.generated.column = column - 2
194
+ this.map.addMapping(mapping)
195
+ } else {
196
+ mapping.source = noSource
197
+ mapping.original.line = 1
198
+ mapping.original.column = 0
199
+ mapping.generated.line = line
200
+ mapping.generated.column = column - 1
201
+ this.map.addMapping(mapping)
202
+ }
203
+ }
204
+ }
205
+ })
206
+ }
207
+
208
+ isAnnotation() {
209
+ if (this.isInline()) {
210
+ return true
211
+ }
212
+ if (typeof this.mapOpts.annotation !== 'undefined') {
213
+ return this.mapOpts.annotation
214
+ }
215
+ if (this.previous().length) {
216
+ return this.previous().some(i => i.annotation)
217
+ }
218
+ return true
219
+ }
220
+
221
+ isInline() {
222
+ if (typeof this.mapOpts.inline !== 'undefined') {
223
+ return this.mapOpts.inline
224
+ }
225
+
226
+ let annotation = this.mapOpts.annotation
227
+ if (typeof annotation !== 'undefined' && annotation !== true) {
228
+ return false
229
+ }
230
+
231
+ if (this.previous().length) {
232
+ return this.previous().some(i => i.inline)
233
+ }
234
+ return true
235
+ }
236
+
237
+ isMap() {
238
+ if (typeof this.opts.map !== 'undefined') {
239
+ return !!this.opts.map
240
+ }
241
+ return this.previous().length > 0
242
+ }
243
+
244
+ isSourcesContent() {
245
+ if (typeof this.mapOpts.sourcesContent !== 'undefined') {
246
+ return this.mapOpts.sourcesContent
247
+ }
248
+ if (this.previous().length) {
249
+ return this.previous().some(i => i.withContent())
250
+ }
251
+ return true
252
+ }
253
+
254
+ outputFile() {
255
+ if (this.opts.to) {
256
+ return this.path(this.opts.to)
257
+ } else if (this.opts.from) {
258
+ return this.path(this.opts.from)
259
+ } else {
260
+ return 'to.css'
261
+ }
262
+ }
263
+
264
+ path(file) {
265
+ if (this.mapOpts.absolute) return file
266
+ if (file.charCodeAt(0) === 60 /* `<` */) return file
267
+ if (/^\w+:\/\//.test(file)) return file
268
+ let cached = this.memoizedPaths.get(file)
269
+ if (cached) return cached
270
+
271
+ let from = this.opts.to ? dirname(this.opts.to) : '.'
272
+
273
+ if (typeof this.mapOpts.annotation === 'string') {
274
+ from = dirname(resolve(from, this.mapOpts.annotation))
275
+ }
276
+
277
+ let path = relative(from, file)
278
+ this.memoizedPaths.set(file, path)
279
+
280
+ return path
281
+ }
282
+
283
+ previous() {
284
+ if (!this.previousMaps) {
285
+ this.previousMaps = []
286
+ if (this.root) {
287
+ this.root.walk(node => {
288
+ if (node.source && node.source.input.map) {
289
+ let map = node.source.input.map
290
+ if (!this.previousMaps.includes(map)) {
291
+ this.previousMaps.push(map)
292
+ }
293
+ }
294
+ })
295
+ } else {
296
+ let input = new Input(this.originalCSS, this.opts)
297
+ if (input.map) this.previousMaps.push(input.map)
298
+ }
299
+ }
300
+
301
+ return this.previousMaps
302
+ }
303
+
304
+ setSourcesContent() {
305
+ let already = {}
306
+ if (this.root) {
307
+ this.root.walk(node => {
308
+ if (node.source) {
309
+ let from = node.source.input.from
310
+ if (from && !already[from]) {
311
+ already[from] = true
312
+ let fromUrl = this.usesFileUrls
313
+ ? this.toFileUrl(from)
314
+ : this.toUrl(this.path(from))
315
+ this.map.setSourceContent(fromUrl, node.source.input.css)
316
+ }
317
+ }
318
+ })
319
+ } else if (this.css) {
320
+ let from = this.opts.from
321
+ ? this.toUrl(this.path(this.opts.from))
322
+ : '<no source>'
323
+ this.map.setSourceContent(from, this.css)
324
+ }
325
+ }
326
+
327
+ sourcePath(node) {
328
+ if (this.mapOpts.from) {
329
+ return this.toUrl(this.mapOpts.from)
330
+ } else if (this.usesFileUrls) {
331
+ return this.toFileUrl(node.source.input.from)
332
+ } else {
333
+ return this.toUrl(this.path(node.source.input.from))
334
+ }
335
+ }
336
+
337
+ toBase64(str) {
338
+ if (Buffer) {
339
+ return Buffer.from(str).toString('base64')
340
+ } else {
341
+ return window.btoa(unescape(encodeURIComponent(str)))
342
+ }
343
+ }
344
+
345
+ toFileUrl(path) {
346
+ let cached = this.memoizedFileURLs.get(path)
347
+ if (cached) return cached
348
+
349
+ if (pathToFileURL) {
350
+ let fileURL = pathToFileURL(path).toString()
351
+ this.memoizedFileURLs.set(path, fileURL)
352
+
353
+ return fileURL
354
+ } else {
355
+ throw new Error(
356
+ '`map.absolute` option is not available in this PostCSS build'
357
+ )
358
+ }
359
+ }
360
+
361
+ toUrl(path) {
362
+ let cached = this.memoizedURLs.get(path)
363
+ if (cached) return cached
364
+
365
+ if (sep === '\\') {
366
+ path = path.replace(/\\/g, '/')
367
+ }
368
+
369
+ let url = encodeURI(path).replace(/[#?]/g, encodeURIComponent)
370
+ this.memoizedURLs.set(path, url)
371
+
372
+ return url
373
+ }
374
+ }
375
+
376
+ module.exports = MapGenerator
@@ -0,0 +1,46 @@
1
+ import LazyResult from './lazy-result.js'
2
+ import { SourceMap } from './postcss.js'
3
+ import Processor from './processor.js'
4
+ import Result, { Message, ResultOptions } from './result.js'
5
+ import Root from './root.js'
6
+ import Warning from './warning.js'
7
+
8
+ declare namespace NoWorkResult {
9
+
10
+ export { NoWorkResult_ as default }
11
+ }
12
+
13
+ /**
14
+ * A Promise proxy for the result of PostCSS transformations.
15
+ * This lazy result instance doesn't parse css unless `NoWorkResult#root` or `Result#root`
16
+ * are accessed. See the example below for details.
17
+ * A `NoWork` instance is returned by `Processor#process` ONLY when no plugins defined.
18
+ *
19
+ * ```js
20
+ * const noWorkResult = postcss().process(css) // No plugins are defined.
21
+ * // CSS is not parsed
22
+ * let root = noWorkResult.root // now css is parsed because we accessed the root
23
+ * ```
24
+ */
25
+ declare class NoWorkResult_ implements LazyResult<Root> {
26
+ catch: Promise<Result<Root>>['catch']
27
+ finally: Promise<Result<Root>>['finally']
28
+ then: Promise<Result<Root>>['then']
29
+ get content(): string
30
+ get css(): string
31
+ get map(): SourceMap
32
+ get messages(): Message[]
33
+ get opts(): ResultOptions
34
+ get processor(): Processor
35
+ get root(): Root
36
+ get [Symbol.toStringTag](): string
37
+ constructor(processor: Processor, css: string, opts: ResultOptions)
38
+ async(): Promise<Result<Root>>
39
+ sync(): Result<Root>
40
+ toString(): string
41
+ warnings(): Warning[]
42
+ }
43
+
44
+ declare class NoWorkResult extends NoWorkResult_ {}
45
+
46
+ export = NoWorkResult
@@ -0,0 +1,137 @@
1
+ 'use strict'
2
+
3
+ let MapGenerator = require('./map-generator')
4
+ let parse = require('./parse')
5
+ const Result = require('./result')
6
+ let stringify = require('./stringify')
7
+ let warnOnce = require('./warn-once')
8
+
9
+ class NoWorkResult {
10
+ get content() {
11
+ return this.result.css
12
+ }
13
+
14
+ get css() {
15
+ return this.result.css
16
+ }
17
+
18
+ get map() {
19
+ return this.result.map
20
+ }
21
+
22
+ get messages() {
23
+ return []
24
+ }
25
+
26
+ get opts() {
27
+ return this.result.opts
28
+ }
29
+
30
+ get processor() {
31
+ return this.result.processor
32
+ }
33
+
34
+ get root() {
35
+ if (this._root) {
36
+ return this._root
37
+ }
38
+
39
+ let root
40
+ let parser = parse
41
+
42
+ try {
43
+ root = parser(this._css, this._opts)
44
+ } catch (error) {
45
+ this.error = error
46
+ }
47
+
48
+ if (this.error) {
49
+ throw this.error
50
+ } else {
51
+ this._root = root
52
+ return root
53
+ }
54
+ }
55
+
56
+ get [Symbol.toStringTag]() {
57
+ return 'NoWorkResult'
58
+ }
59
+
60
+ constructor(processor, css, opts) {
61
+ css = css.toString()
62
+ this.stringified = false
63
+
64
+ this._processor = processor
65
+ this._css = css
66
+ this._opts = opts
67
+ this._map = undefined
68
+
69
+ let str = stringify
70
+ this.result = new Result(this._processor, undefined, this._opts)
71
+ this.result.css = css
72
+
73
+ let self = this
74
+ Object.defineProperty(this.result, 'root', {
75
+ get() {
76
+ return self.root
77
+ }
78
+ })
79
+
80
+ let map = new MapGenerator(str, undefined, this._opts, css)
81
+ if (map.isMap()) {
82
+ let [generatedCSS, generatedMap] = map.generate()
83
+ if (generatedCSS) {
84
+ this.result.css = generatedCSS
85
+ }
86
+ if (generatedMap) {
87
+ this.result.map = generatedMap
88
+ }
89
+ } else {
90
+ map.clearAnnotation()
91
+ this.result.css = map.css
92
+ }
93
+ }
94
+
95
+ async() {
96
+ if (this.error) return Promise.reject(this.error)
97
+ return Promise.resolve(this.result)
98
+ }
99
+
100
+ catch(onRejected) {
101
+ return this.async().catch(onRejected)
102
+ }
103
+
104
+ finally(onFinally) {
105
+ return this.async().then(onFinally, onFinally)
106
+ }
107
+
108
+ sync() {
109
+ if (this.error) throw this.error
110
+ return this.result
111
+ }
112
+
113
+ then(onFulfilled, onRejected) {
114
+ if (process.env.NODE_ENV !== 'production') {
115
+ if (!('from' in this._opts)) {
116
+ warnOnce(
117
+ 'Without `from` option PostCSS could generate wrong source map ' +
118
+ 'and will not find Browserslist config. Set it to CSS file path ' +
119
+ 'or to `undefined` to prevent this warning.'
120
+ )
121
+ }
122
+ }
123
+
124
+ return this.async().then(onFulfilled, onRejected)
125
+ }
126
+
127
+ toString() {
128
+ return this._css
129
+ }
130
+
131
+ warnings() {
132
+ return []
133
+ }
134
+ }
135
+
136
+ module.exports = NoWorkResult
137
+ NoWorkResult.default = NoWorkResult