siphon-cli
Version:
Simple bundler for web applications. 📦🔧🧡
136 lines (135 loc) • 6.3 kB
JavaScript
;
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;