js2flowchart
Version:
> Why? While I've been working on [Under-the-hood-ReactJS](https://github.com/Bogdan-Lyashenko/Under-the-hood-ReactJS) I spent enormous amount of time on creating schemes. Each change in code or flowchart affects all entire scheme instantly, forcing you t
92 lines (77 loc) • 2.6 kB
JavaScript
import { TOKEN_TYPES, TOKEN_KEYS, MODIFIED_TYPES } from 'shared/constants';
const extractNodeName = (node, field) => {
const name = node.name.split(`.${field}(`)[0];
if (name.includes('=')) {
return name.split('=');
}
return [name];
};
const testNode = (node, field) => node.name.includes(`.${field}(`);
export const DEFINED_MODIFIERS = {
forEach: {
test: node => testNode(node, 'forEach'),
updates: {
name: node => `each in ${extractNodeName(node, 'forEach')[0]}`,
type: TOKEN_TYPES.LOOP,
body: node => [...node.body[0].body]
}
},
filter: {
test: node => testNode(node, 'filter'),
updates: {
name: node =>
`in ${extractNodeName(node, 'filter')[1]} to ${extractNodeName(node, 'filter')[0]}`,
prefixName: 'filter',
type: TOKEN_TYPES.LOOP
}
},
map: {
test: node => testNode(node, 'map'),
updates: {
name: node =>
`from ${extractNodeName(node, 'map')[1]} to ${extractNodeName(node, 'map')[0]}`,
prefixName: 'map',
type: TOKEN_TYPES.LOOP
}
}
};
export const destructionModifier = (test, newNameFn) => ({
test,
updates: {
name: newNameFn,
body: [],
type: MODIFIED_TYPES.DESTRUCTED
}
});
export const arrowFunctionReturnModifier = () => ({
test: node =>
node.isBodyEntry &&
node.parent &&
node.parent.subType === TOKEN_TYPES.ARROW_FUNCTION_EXPRESSION,
updates: {
name: node => 'return ' + node.name,
type: TOKEN_TYPES.RETURN
}
});
export const expressionCallbacksModifier = () => ({
test: node => node.pathParentType === TOKEN_TYPES.CALL_EXPRESSION,
updates: {
subTreeUpdate: nodes => {
nodes.forEach(node => {
const parentBody = node.parent.body,
index = parentBody.indexOf(node) + 1;
for (let i = index; i < parentBody.length; i++) {
let sibling = parentBody[i];
if (sibling && sibling.type === TOKEN_TYPES.CALL_EXPRESSION) {
node.parent.body = parentBody.filter(n => n !== node);
sibling.body = [...(sibling.body || []), node];
return;
}
}
});
}
}
});
export const MODIFIER_PRESETS = {
es5ArrayIterators: [DEFINED_MODIFIERS.forEach, DEFINED_MODIFIERS.filter, DEFINED_MODIFIERS.map]
};