UNPKG

siphon-cli

Version:

Simple bundler for web applications. 📦🔧🧡

136 lines (135 loc) • 6.3 kB
"use strict"; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); var __1 = require("../.."); var types_1 = require("../../../../../types"); var creator_1 = require("../helpers/creator"); function default_1(ast) { var i = 0; var globalVarTracker = new Map(); __1.default.traverse(ast, { BlockStatement: function (node, path) { if (path.scope.variables.size > 0) return; if (node.body.length > 1 || node.body.length === 0) return; if (/Statement/.test(path.parent.type)) return node.body[0]; }, VariableDeclaration: function (node, path) { var _a; if (!/Block|Program/.test(path.parent.type)) return; var body = path.parent.body, index = body.indexOf(node) - 1; while (((_a = body[index]) === null || _a === void 0 ? void 0 : _a.type) === "VariableDeclaration" && body[index].kind === node.kind) { node.declarations = body[index].declarations.concat(node.declarations); body[index--] = new types_1.EmptyNode(0); } }, ExpressionStatement: function (node, path) { var _a; var _b; if (!/Block|Program/.test(path.parent.type)) return; var newseq = new types_1.SequenceExpression(node.loc.start); newseq.expressions = []; newseq.expressions.push(node.expression); var body = path.parent.body, index = body.indexOf(node) - 1; while (/ExpressionStat/.test((_b = body[index]) === null || _b === void 0 ? void 0 : _b.type)) { var expression = body[index].expression; if (/Sequence/.test(expression.type)) { (_a = newseq.expressions).splice.apply(_a, __spreadArray([0, 0], expression.expressions, false)); } else newseq.expressions.splice(0, 0, expression); newseq.loc.start = expression.loc.start; body[index--] = new types_1.EmptyNode(0); } return (0, creator_1.expressionStatement)(newseq); }, ReturnStatement: function (node, path) { var _a; var _b, _c; if (!/Block|Program/.test(path.parent.type)) return; if (!node.argument) return; var body = path.parent.body, index = body.indexOf(node) - 1; if (body[index] && /ExpressionStat/.test(body[index].type)) { var previousExp = body[index].expression; var seq = new types_1.SequenceExpression((_c = (_b = node.argument) === null || _b === void 0 ? void 0 : _b.loc.start) !== null && _c !== void 0 ? _c : 0); seq.expressions = []; if (previousExp instanceof types_1.SequenceExpression) { seq.expressions = previousExp.expressions; } else seq.expressions.push(previousExp); if (node.argument instanceof types_1.SequenceExpression) { (_a = seq.expressions).push.apply(_a, node.argument.expressions); } else seq.expressions.push(node.argument); body[index] = new types_1.EmptyNode(0); node.argument = seq; } return node; }, IfStatement: function (node, path) { if (node.consequent instanceof types_1.ExpressionStatement) { if (node.alternate === null) { var and = new types_1.LogicalExpression(node.loc.start); and.left = node.test; and.operator = "&&"; and.right = node.consequent.expression; and.loc.end = node.loc.end; return (0, creator_1.expressionStatement)(and); } else if (node.alternate instanceof types_1.ExpressionStatement) { var ternary = new types_1.ConditionalExpression(node.loc.start); ternary.test = node.test; ternary.consequent = node.consequent.expression; ternary.alternate = node.alternate.expression; ternary.loc.end = node.loc.end; return (0, creator_1.expressionStatement)(ternary); } } else if (node.consequent instanceof types_1.ReturnStatement && node.alternate instanceof types_1.ReturnStatement) { var ret = new types_1.ReturnStatement(node.loc.start); var argument = new types_1.ConditionalExpression(node.loc.start); argument.test = node.test; argument.consequent = node.consequent.argument || (0, creator_1.newIdentifier)("undefined"); argument.alternate = node.alternate.argument || (0, creator_1.newIdentifier)("undefined"); ret.argument = argument; return ret; } }, Literal: function (node, path) { if (typeof node.value !== "boolean") return; var y = node; if (y.value) { y.raw = "!0"; y.value = (0, creator_1.unaryExpression)("!", (0, creator_1.numberLiteral)(0)); } else { y.raw = "!1"; y.value = (0, creator_1.unaryExpression)("!", (0, creator_1.numberLiteral)(1)); } return y; }, }); return ast; } exports.default = default_1;