forked from auth0/rules
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbuild
executable file
·96 lines (79 loc) · 2.17 KB
/
build
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/env node
var marked = require('marked');
var yaml = require('js-yaml');
var async = require('async');
marked.setOptions({
renderer: new marked.Renderer(),
gfm: true,
tables: true,
breaks: false,
pedantic: false,
sanitize: false,
smartLists: true,
smartypants: false
});
var fs = require('fs');
var path = require('path');
var files = fs.readdirSync(__dirname + '/rules').map(function (file) {
return path.join(__dirname, '/rules', file);
});
async.map(files, function (file, callback) {
fs.readFile(file, 'utf8', function (err, content) {
if (err) return callback(err);
var meta = {};
if (content.split('\n')[0] === '---') {
var split = content.split('---');
meta = yaml.safeLoad(split[1]);
content = split.slice(2).join('---');
}
if (!meta.gallery) {
return callback();
}
var lex = marked.lexer(content);
var title = lex.filter(function (t) {
return t.type === 'heading';
})[0].text;
var descriptionMD = lex.filter(function (t) {
return !~['heading', 'code'].indexOf(t.type);
});
descriptionMD.links = {};
var description = marked.parser(descriptionMD);
var code = lex.filter(function (t) {
return t.type === 'code';
})[0].text;
var result = {
title: title || meta.title,
categories: meta.categories || ['default'],
description: description,
code: code,
};
callback(null, result);
});
}, function (err, results) {
if (err) {
console.log(err.stack);
process.exit(1);
}
//group by category
var rules = results;
var categories = rules.filter(function (rt) {
return !!rt;
}).map(function (rule) {
return rule.categories;
}).reduce(function (prev, curr) {
var new_cats = curr.filter(function (cat) {
return !~prev.indexOf(cat);
});
return prev.concat(new_cats);
}, []).map(function (cat) {
return {
name: cat,
templates: rules.filter(function (t) {
return t && ~t.categories.indexOf(cat);
})
};
});
console.log('all good!');
fs.writeFileSync(__dirname + '/rules.json', JSON.stringify(categories, null, 2));
process.exit(0);
});