Blame view

node_modules/postcss/lib/fromJSON.js 1.47 KB
7820380e   “wangming”   1
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
  'use strict'
  
  let Declaration = require('./declaration')
  let PreviousMap = require('./previous-map')
  let Comment = require('./comment')
  let AtRule = require('./at-rule')
  let Input = require('./input')
  let Root = require('./root')
  let Rule = require('./rule')
  
  function fromJSON(json, inputs) {
    if (Array.isArray(json)) return json.map(n => fromJSON(n))
  
    let { inputs: ownInputs, ...defaults } = json
    if (ownInputs) {
      inputs = []
      for (let input of ownInputs) {
        let inputHydrated = { ...input, __proto__: Input.prototype }
        if (inputHydrated.map) {
          inputHydrated.map = {
            ...inputHydrated.map,
            __proto__: PreviousMap.prototype
          }
        }
        inputs.push(inputHydrated)
      }
    }
    if (defaults.nodes) {
      defaults.nodes = json.nodes.map(n => fromJSON(n, inputs))
    }
    if (defaults.source) {
      let { inputId, ...source } = defaults.source
      defaults.source = source
      if (inputId != null) {
        defaults.source.input = inputs[inputId]
      }
    }
    if (defaults.type === 'root') {
      return new Root(defaults)
    } else if (defaults.type === 'decl') {
      return new Declaration(defaults)
    } else if (defaults.type === 'rule') {
      return new Rule(defaults)
    } else if (defaults.type === 'comment') {
      return new Comment(defaults)
    } else if (defaults.type === 'atrule') {
      return new AtRule(defaults)
    } else {
      throw new Error('Unknown node type: ' + json.type)
    }
  }
  
  module.exports = fromJSON
  fromJSON.default = fromJSON