parser.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. const fs = require('fs');
  2. const path = require('path');
  3. const t = require('@babel/types');
  4. const { parse } = require('@babel/parser');
  5. const originCode = fs.readFileSync(
  6. path.join(__dirname, '../src/router/index.js'),
  7. 'utf-8',
  8. );
  9. const originAST = parse(originCode, { sourceType: 'module' });
  10. const expDefNode = originAST.program.body.find((node) =>
  11. t.isExportDefaultDeclaration(node),
  12. );
  13. const rootNode = expDefNode.declaration.elements[0];
  14. const pagesNodeArr = rootNode.properties.find(
  15. (node) => node.key && node.key.name === 'children',
  16. );
  17. function getChildrenArr(rootNode) {
  18. const result = rootNode.properties.find(
  19. (node) => node.key && node.key.name === 'children',
  20. );
  21. if (result) {
  22. return result.value;
  23. } else {
  24. return null;
  25. }
  26. }
  27. function getValueByKey(rootNode, key) {
  28. if (t.isObjectExpression(rootNode)) {
  29. const asminode = rootNode.properties.find(
  30. (node) => node.key && node.key.name === key,
  31. );
  32. if (!asminode) {
  33. return null;
  34. }
  35. if (
  36. t.isStringLiteral(asminode.value) ||
  37. t.isNumericLiteral(asminode.value)
  38. ) {
  39. return asminode.value.value;
  40. } else if (t.isObjectExpression(asminode.value)) {
  41. return getObjValue(asminode.value);
  42. } else {
  43. return null;
  44. }
  45. } else {
  46. return null;
  47. }
  48. }
  49. function getObjValue(ObjectExpression) {
  50. if (t.isObjectExpression(ObjectExpression)) {
  51. const _obj = {};
  52. ObjectExpression.properties.forEach((n) => {
  53. _obj[n.key.name] = getValueByKey(ObjectExpression, n.key.name);
  54. });
  55. return _obj;
  56. } else {
  57. return null;
  58. }
  59. }
  60. const mapTree = (dataArr) => {
  61. return dataArr.elements.map((item) => {
  62. const name = getValueByKey(item, 'name');
  63. const path = getValueByKey(item, 'path');
  64. const redirect = getValueByKey(item, 'redirect');
  65. const meta = getValueByKey(item, 'meta');
  66. let children = [];
  67. if (getChildrenArr(item)) {
  68. children = mapTree(getChildrenArr(item));
  69. } else {
  70. children = null;
  71. }
  72. return { name, path, redirect, meta, children };
  73. });
  74. };
  75. module.exports = () => mapTree(pagesNodeArr.value);