st-bundle
Version:
CLI for watching and bundling SpringType projects.
115 lines (114 loc) • 3.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const ts = require("typescript");
function extractValue(node) {
let value;
let text = node.getText();
if (ts.isStringLiteral(node.compilerNode)) {
value = node.compilerNode.text;
}
else if (ts.isNumericLiteral(node.compilerNode)) {
value = parseInt(node.compilerNode.text);
}
else {
if (text === 'true') {
value = true;
}
else if (text === 'false') {
value = false;
}
}
return value;
}
function computeLeftRight(left, right, sign) {
switch (sign) {
case '!=':
return left != right;
case '!==':
return left !== right;
case '===':
return left === right;
case '==':
return left === right;
case '>':
return left > right;
case '>=':
return left >= right;
case '<':
return left < right;
case '<=':
return left <= right;
}
}
function getStatementText(node) {
const syntaxList = node.getChildSyntaxList();
if (syntaxList) {
return syntaxList.getText({ trimLeadingIndentation: true });
}
else if (node.compilerNode['expression']) {
return node.compilerNode['expression'].getText();
}
return node.getText();
}
function setResult(result, node) {
if (result) {
node.replaceWithText(getStatementText(node.getThenStatement()));
}
else {
const elseStatement = node.getElseStatement();
if (elseStatement) {
node.replaceWithText(getStatementText(node.getElseStatement()));
}
else {
node.remove();
}
}
}
function onIfStatement(node, props) {
const expression = node.getExpression();
const desc = expression.getDescendants();
if (desc.length === 3) {
const left = extractValue(desc[0]);
const sign = desc[1].getText();
const right = extractValue(desc[2]);
if (left !== undefined && right !== undefined) {
const result = computeLeftRight(left, right, sign);
if (typeof result !== undefined) {
setResult(result, node);
}
}
}
else {
const children = expression.getChildren();
if (children.length === 2) {
const sign = children[0].getText();
const value = children[1].getText();
if (sign === '!' && (value === 'true' || value === 'false')) {
const bool = value === 'true' ? true : false;
setResult(!bool, node);
}
}
else {
const text = expression.getText();
if (text === 'true') {
setResult(true, node);
}
if (text === 'false') {
setResult(false, node);
}
}
}
}
function conditionUnwrapperProduction(props) {
const local = { ctx: props.ctx, fuseBoxPath: props.fuseBoxPath, file: props.file, insertions: [] };
const Identifiers = props.file.getDescendantsOfKind(ts.SyntaxKind.IfStatement);
Identifiers.forEach(id => {
if (!id.wasForgotten()) {
onIfStatement(id, local);
}
});
local.insertions.forEach(ins => {
props.file.insertText(0, ins);
});
}
exports.conditionUnwrapperProduction = conditionUnwrapperProduction;