UNPKG

lively.ast

Version:

Parsing JS code into ASTs and tools to query and transform these trees.

45 lines (36 loc) 1.19 kB
import Visitor from "../generated/estree-visitor.js"; import {funcCall, member} from "./nodes.js"; class ObjectSpreadTransformer extends Visitor { accept(node, state, path) { if (node.type === "ObjectExpression") { node = this.transformSpreadProperty(node); } return super.accept(node, state, path); } transformSpreadProperty(node) { var currentGroup = [], propGroups = [currentGroup]; node.properties.forEach(prop => { if (prop.type !== "SpreadProperty") currentGroup.push(prop) else { propGroups.push(prop) currentGroup = []; propGroups.push(currentGroup); } }); if (propGroups.length === 1) return node; if (!currentGroup.length) propGroups.pop(); return funcCall( member("Object", "assign"), ...propGroups.map(group => { return group.type === "SpreadProperty" ? group.argument : { properties: group, type: 'ObjectExpression' } })) } } export default function objectSpreadTransform(parsed) { // "var x = {y, ...z}" => "var x = Object.assign({ y }, z);" return new ObjectSpreadTransformer().accept(parsed, {}, []); };