123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- 'use strict'
- let AtRule = require('./at-rule')
- let Comment = require('./comment')
- let Declaration = require('./declaration')
- let Input = require('./input')
- let PreviousMap = require('./previous-map')
- 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
|