babel-plugin-console
Version:
Babel plugin with additional console helper functions
124 lines (93 loc) • 5.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _utils = require('../utils');
var _looksLike = require('../utils/looks-like');
var _looksLike2 = _interopRequireDefault(_looksLike);
var _identifiers = require('./identifiers');
var _signatures = require('./signatures');
var _signatures2 = _interopRequireDefault(_signatures);
var _templates = require('./templates');
var _templates2 = _interopRequireDefault(_templates);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = (path, template, t) => {
const { buildGroupCollapsed, buildGroupEnd, buildLog } = (0, _templates2.default)(template);
const scope = traverseFunctions(path, t);
if (!scope) {
return;
}
const { bindings, parameterIdentifiers, returnStatement, signature, variableIdentifiers } = scope;
const mapIdentifer = identifier => {
const { loc: { start: { column, line } }, name } = identifier;
return buildLog(t.stringLiteral(`(${line}:${column})`), t.stringLiteral(`${name}:`), identifier)(1);
};
const parameters = parameterIdentifiers.map(mapIdentifer);
const variables = variableIdentifiers.map(mapIdentifer);
const buildReturn = returnStatement => {
if (returnStatement) {
const { loc: { start: { column, line } } } = returnStatement;
return buildLog(t.stringLiteral(`(${line}:${column})`), returnStatement)(1);
}
return buildLog(t.stringLiteral('Void'))(1);
};
const joinParams = params => params.map(({ name }) => name).join(', ');
const scriptScope = Object.keys(bindings).filter(key => {
const binding = bindings[key];
const isRequire = (0, _looksLike2.default)(binding.path, { node: { init: { callee: { name: 'require' } } } });
return binding.kind !== 'module' && !isRequire;
}).map(key => {
const binding = bindings[key];
const { identifier } = binding;
const { loc: { start: { column, line } }, name } = identifier;
const isFunction = (0, _looksLike2.default)(binding, { path: t.isFunctionDeclaration });
const isArrow = (0, _looksLike2.default)(binding.path, { node: { init: t.isArrowFunctionExpression } });
const isFunctionExpression = (0, _looksLike2.default)(binding.path, { node: { init: t.isFunctionExpression } });
if (isArrow) {
const signature = (0, _signatures.buildArrowFunctionSignature)(line, column, binding.kind, name, joinParams(binding.path.node.init.params));
return buildLog(t.stringLiteral(signature))(1);
}
if (isFunction) {
const signature = (0, _signatures.buildFunctionDeclarationSignature)(line, column, name, joinParams(binding.path.node.params));
return buildLog(t.stringLiteral(signature))(1);
}
if (isFunctionExpression) {
const signature = (0, _signatures.buildFunctionExpressionSignature)(line, column, binding.kind, name, joinParams(binding.path.node.init.params));
return buildLog(t.stringLiteral(signature))(1);
}
return buildLog(t.stringLiteral(`(${line}:${column})`), t.stringLiteral(`${name}:`), identifier)(1);
});
return [buildLog(...path.node.arguments)(0), buildGroupCollapsed(t.stringLiteral(signature))(0), buildGroupCollapsed(t.stringLiteral('Parameters'))(1), ...parameters, buildGroupEnd(t.stringLiteral('Parameters')), buildGroupCollapsed(t.stringLiteral('Variables'))(1), ...variables, buildGroupEnd(t.stringLiteral('Variables')), buildGroupCollapsed(t.stringLiteral('Return'))(1), buildReturn(returnStatement), buildGroupEnd(t.stringLiteral('Return')), buildGroupCollapsed(t.stringLiteral('Script'))(1), ...scriptScope, buildGroupEnd(t.stringLiteral('Script')), buildGroupEnd(t.stringLiteral(signature))];
};
const traverseFunctions = (path, t) => {
const parentFunction = findParentFunction(path, t);
if (!parentFunction) {
return null;
}
let rootFunction = parentFunction;
let variables = [(0, _identifiers.getVariableIdentifiers)(parentFunction.scope.bindings)];
let parameters = [(0, _identifiers.getParamIdentifiers)(parentFunction.scope.bindings)];
while (isNotRootFunction(rootFunction, t)) {
const maybeParentFunction = findParentFunction(rootFunction, t);
if (!maybeParentFunction) {
break;
}
rootFunction = maybeParentFunction;
variables.unshift((0, _identifiers.getVariableIdentifiers)(rootFunction.scope.bindings));
parameters.unshift((0, _identifiers.getParamIdentifiers)(rootFunction.scope.bindings));
}
const { bindings } = rootFunction.scope.parent;
const stmt = parentFunction.node.body.body.find(rest => t.isReturnStatement(rest));
const returnStatement = stmt && stmt.argument;
return {
bindings,
parameterIdentifiers: (0, _utils.flatten)(parameters),
returnStatement,
signature: (0, _signatures2.default)(t, parameters, rootFunction),
variableIdentifiers: (0, _utils.flatten)(variables)
};
};
const findParentFunction = (path, t) => path.findParent(parent => {
return t.isFunctionDeclaration(parent) || t.isArrowFunctionExpression(parent) || t.isFunctionExpression(parent);
});
const isNotRootFunction = (path, t) => !(0, _looksLike2.default)(path, { node: { id: t.isIdentifier } }) && !t.isVariableDeclarator(path.parent) && !t.isFunctionExpression(path.parent);