main.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. const fs = require("fs");
  2. const path_ = require("path");
  3. const rootdir = path_.resolve(process.argv[2] ?? '.');
  4. const parser = require('@babel/parser');
  5. const traverse = require('@babel/traverse').default;
  6. const { ModuleDoc } = require("./defs");
  7. const processors = require("./processors");
  8. const doc_module = new ModuleDoc();
  9. // List files in this directory
  10. const files = fs.readdirSync(rootdir);
  11. for ( const file of files ) {
  12. const stat = fs.statSync(path_.join(rootdir, file));
  13. if ( stat.isDirectory() ) {
  14. continue;
  15. }
  16. if ( ! file.endsWith('.js') ) continue;
  17. const type =
  18. file.endsWith('Service.js') ? 'service' :
  19. file.endsWith('Module.js') ? 'module' :
  20. null;
  21. if ( type === null ) continue;
  22. console.log('file', file);
  23. const code = fs.readFileSync(path_.join(rootdir, file), 'utf8');
  24. const firstLine = code.slice(0, code.indexOf('\n'));
  25. let metadata = {};
  26. const METADATA_PREFIX = '// METADATA // ';
  27. if ( firstLine.startsWith(METADATA_PREFIX) ) {
  28. metadata = JSON.parse(firstLine.slice(METADATA_PREFIX.length));
  29. }
  30. const ast = parser.parse(code);
  31. const traverse_callbacks = {};
  32. const context = {
  33. type,
  34. doc_module,
  35. filename: file,
  36. };
  37. for ( const processor of processors ) {
  38. if ( processor.match(context) ) {
  39. for ( const key in processor.traverse ) {
  40. if ( ! traverse_callbacks[key] ) {
  41. traverse_callbacks[key] = [];
  42. }
  43. traverse_callbacks[key].push(processor.traverse[key]);
  44. }
  45. }
  46. }
  47. for ( const key in traverse_callbacks ) {
  48. traverse(ast, {
  49. [key] (path) {
  50. for ( const callback of traverse_callbacks[key] ) {
  51. callback(path, context);
  52. }
  53. }
  54. });
  55. }
  56. }
  57. const outfile = path_.join(rootdir, 'README.md');
  58. const out = doc_module.toMarkdown();
  59. fs.writeFileSync(outfile, out);