Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var class_match_regexp = /^(?:\s*class\s+)([a-z._]+)(?:\s+extends\s+([a-z._]+))?$/i;
- var fs = require('fs');
- var path = require('path');
- var depcalc = require('depcalc');
- var files = recursive_readdir_sync('.');
- var classes = {};
- files = files.filter(function (filename) {
- return path.extname(filename) == '.coffee';
- });
- files.forEach(function (filename) {
- var str = fs.readFileSync(filename).toString();
- str.split('\n').forEach(function (line) {
- var match = line.match(class_match_regexp);
- if (!match) return;
- classes[match[1]] = match[2] ? match[2] : null;
- });
- });
- var deps = {};
- Object.keys(classes).forEach(function (cls) {
- if (classes[cls] == null) {
- deps[cls] = [];
- return;
- }
- deps[cls] = [cls];
- deps[cls] = deps[cls].concat(get_deps(classes, classes[cls]));
- });
- var tree = {};
- Object.keys(deps).forEach(function (cls) {
- var arr = deps[cls].reverse();
- root = tree;
- for (var i=0; i<arr.length; ++i) {
- root[arr[i]] = root[arr[i]] || {};
- root = root[arr[i]];
- }
- });
- var tab = '| ';
- var output = [];
- var iterate = function (tree, indent) {
- var keys = Object.keys(tree);
- if (!keys.length) return;
- keys.sort().forEach(function (node) {
- output.push(indent + node);
- iterate(tree[node], indent + tab);
- });
- };
- iterate(tree, '');
- console.log(output.join('\n'));
- function get_deps (map, cls) {
- var result = [cls];
- var key = cls;
- while (map[key]) {
- result.push(map[key]);
- key = map[key];
- }
- return result;
- }
- function pick (object, value) {
- var result = [];
- return Object.keys(object).filter(function (key) {
- return object[key] == value;
- });
- }
- function recursive_readdir_sync (root, _queue) {
- _queue = _queue || [];
- var list = fs.readdirSync(root).map(function (name) { return path.join(root, name); });
- var dirs = list.filter(function (filepath) {
- return fs.lstatSync(filepath).isDirectory();
- });
- dirs.forEach(function (filepath) { recursive_readdir_sync(filepath, _queue); });
- list.filter(function (filepath) {
- return dirs.indexOf(filepath) === -1;
- }).forEach(function (filepath) {
- _queue.push(filepath);
- });
- return _queue;
- }
Advertisement
Add Comment
Please, Sign In to add comment